Вот код, который должен вам помочь.Но прежде чем читать его, вы должны знать, что происходит:
- Ваш клиент не отправляет на сервер информацию о прекращении чтения (прочитайте код клиента ниже).Вот почему сервер застревает в цикле while, когда пытается прочитать данные, отправленные клиентом.Вероятно, поэтому вы попытались отправить данные обратно клиенту.Отключите выход сокета со стороны клиента, чтобы соблюдать контракт Socket, и правильно освободите сокет (см. TCP / IP).
- Данное решение не учитывает, что сервер должен оставаться в рабочем состоянии после того, как он выполнит свой долг.Тогда сервер не сможет обслуживать более одного клиента одновременно.Этот сервер предлагает единовременное обслуживание, которое бессмысленно.Чтобы преодолеть эту проблему, вы должны поместить все в цикл while и связать каждый новый серверный процесс в новый поток (я позволю вам сделать это, это очень приятно).
- Сервер не учитывает весь размер данных, и он может столкнуться с ошибкой нехватки памяти, если данные слишком тяжелые.Вы должны найти способ избежать этой проблемы в реальной реализации.
- Обе программы должны перехватить исключение и зарегистрировать его где-нибудь, чтобы вы могли быть в курсе любых ошибок.
- Написание сервера не так просто.Обычно вы должны написать какой-то протокол с заголовками и тому подобным.Чтобы избежать этого, используйте такие объекты, как ObjectOutputStream и ObjectInputStream, но у него есть некоторые ограничения, такие как ограничение вашего сервера в мире Java.
КЛИЕНТ
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
public class Client {
public void send(File file)
{
Socket sc = null;
try
{
byte[] bytearray = new byte[4096];
sc = new Socket("localhost", 4444);
// 1. Read the file, send its content, close it.
int count;
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
OutputStream os = sc.getOutputStream();
while((count = bis.read(bytearray))>0)
{
os.write(bytearray);
}
fis.close();
sc.shutdownOutput();
// 2. Delete old file, receive data, write it to new File.
InputStream is = sc.getInputStream();
bytearray = new byte[4096];
// Eventually do what you want with the file: new one, append, etc.
file.delete();
file.createNewFile();
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
count = 0;
while((count = is.read(bytearray)) > 0)
{
bos.write(bytearray, 0, count);
}
fos.close();
bos.close();
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
if (sc != null)
{
try
{
sc.close();
} catch (IOException e) {}
}
}
}
}
СЕРВЕР
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server
{
Server()
{
Socket s = null;
byte[] bytearray = new byte[4096];
try (ServerSocket ss = new ServerSocket(4444))
{
s = ss.accept();
InputStream is = s.getInputStream();
// 1. Recieve data and put it to UpperCase.
String data = "";
int count;
while((count = is.read(bytearray)) > 0)
{
data += new String(bytearray, 0, count);
}
data = data.toUpperCase();
System.out.println(data);
// 2. Send back data.
OutputStream os = s.getOutputStream();
os.write(data.getBytes());
os.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
ИСПЫТАТЕЛЬНАЯ ПРОГРАММА
Это должно помочь вам протестировать обе ваши программы в одном и том же проекте в IDE.
import java.io.File;
public class Test
{
public static void main(String[] args)
{
Client c = new Client();
(new Thread()
{
public void run()
{
Server s = new Server();
}
}).start();
c.send(new File("test.txt"));
}
}