Java 尝试实现多线程时,服务器/客户端程序不工作
在我尝试在服务器上实现多线程之前,我正在创建一个服务器客户端程序。我不确定是什么导致了这个问题。客户端在选择上载或下载选项并发送文件的第一行后连接到服务器,然后客户端崩溃,出现以下异常:Java 尝试实现多线程时,服务器/客户端程序不工作,java,multithreading,server,client,Java,Multithreading,Server,Client,在我尝试在服务器上实现多线程之前,我正在创建一个服务器客户端程序。我不确定是什么导致了这个问题。客户端在选择上载或下载选项并发送文件的第一行后连接到服务器,然后客户端崩溃,出现以下异常: java.io.EOFException at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) at java.io.ObjectInputStream$BlockDataInputStream.readSh
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at Client.upload(Client.java:66)
at Client.main(Client.java:99)
多线程前的服务器代码
import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;
public class Server
{
private static ServerSocket server;
private static int port = 8001;
public static void upload(String fileName)
{
try {
System.out.println("File Uploading");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),
"utf-8"));
System.out.println("Created " + fileName);
while(true)
{
System.out.println("Waiting for next line");
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
if(message.equalsIgnoreCase("%end%"))break;
out.write(message + "\n");
System.out.println("Message Received: " + message);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Server Received: " + message);
ois.close();
oos.close();
socket.close();
}
out.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void download(String fileName)
{
try {
Socket socket = null;
System.out.println("Selected Download");
System.out.println(fileName + " Downloading");
BufferedReader in = new BufferedReader(new FileReader(fileName));
ObjectOutputStream oos = null;
String line = null;
while((line = in.readLine()) != null)
{
try
{
socket = server.accept();
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(line);
System.out.println("Line " + line + " sent to client");
oos.close();
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println("Sending end of file");
Socket endSocket = server.accept();
ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
end.writeObject("%end%");
end.close();
in.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws IOException, ClassNotFoundException
{
while(true)
{
try {
server = new ServerSocket(port);
System.out.println("Waiting for upload or download request from client");
Socket socketUpDown = server.accept();
ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
String upDown = (String)request.readObject();
if(upDown.equals("Upload"))
{
upload((String)request.readObject());
}
else if(upDown.equals("Download"))
{
download((String)request.readObject());
}
socketUpDown.close();
}
catch(IOException | ClassNotFoundException e){
e.printStackTrace();
}
}
}
}
import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;
public class Server
{
private static ServerSocket server;
private static int port = 8001;
public static void main(String args[]) throws IOException, ClassNotFoundException
{
try
{
server = new ServerSocket(port);
int counter = 0;
System.out.println("Server Started ....");
while(true)
{
counter++;
Socket serverClient = server.accept();
System.out.println("A new client is connected : " + serverClient);
ServerClientThread sct = new ServerClientThread(serverClient, counter);
sct.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
private static class ServerClientThread extends Thread
{
private int clientNo;
public ServerClientThread(Socket socket, int clientNo)
{
this.clientNo = clientNo;
}
public void run()
{
try {
System.out.println("Waiting for upload or download request from client");
Socket socketUpDown = server.accept();
ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
String upDown = (String)request.readObject();
if(upDown.equals("Upload"))
{
upload((String)request.readObject());
}
else if(upDown.equals("Download"))
{
download((String)request.readObject());
}
socketUpDown.close();
}
catch(IOException | ClassNotFoundException e){
e.printStackTrace();
}
finally{
System.out.println("Client -" + clientNo + " exit!! ");
}
}
public static void upload(String fileName)
{
try {
System.out.println("File Uploading");
Writer out = new BufferedWriter(new OutputStreamWriter(new
FileOutputStream(fileName), "utf-8"));
System.out.println("Created " + fileName);
while(true)
{
System.out.println("Waiting for next line");
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
if(message.equalsIgnoreCase("%end%"))break;
out.write(message + "\n");
System.out.println("Message Received: " + message);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Received" + message);
ois.close();
oos.close();
socket.close();
}
out.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void download(String fileName)
{
try {
Socket socket = null;
System.out.println("Selected Download");
System.out.println(fileName + " Downloading");
BufferedReader in = new BufferedReader(new FileReader(fileName));
ObjectOutputStream oos = null;
String line = null;
while((line = in.readLine()) != null)
{
try{
socket = server.accept();
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(line);
System.out.println("Line " + line + " written to file");
oos.close();
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Sending end of file");
Socket endSocket = server.accept();
ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
end.writeObject("%end%");
end.close();
in.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
}
多线程后的服务器代码
import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;
public class Server
{
private static ServerSocket server;
private static int port = 8001;
public static void upload(String fileName)
{
try {
System.out.println("File Uploading");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName),
"utf-8"));
System.out.println("Created " + fileName);
while(true)
{
System.out.println("Waiting for next line");
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
if(message.equalsIgnoreCase("%end%"))break;
out.write(message + "\n");
System.out.println("Message Received: " + message);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Server Received: " + message);
ois.close();
oos.close();
socket.close();
}
out.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void download(String fileName)
{
try {
Socket socket = null;
System.out.println("Selected Download");
System.out.println(fileName + " Downloading");
BufferedReader in = new BufferedReader(new FileReader(fileName));
ObjectOutputStream oos = null;
String line = null;
while((line = in.readLine()) != null)
{
try
{
socket = server.accept();
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(line);
System.out.println("Line " + line + " sent to client");
oos.close();
Thread.sleep(100);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
System.out.println("Sending end of file");
Socket endSocket = server.accept();
ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
end.writeObject("%end%");
end.close();
in.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws IOException, ClassNotFoundException
{
while(true)
{
try {
server = new ServerSocket(port);
System.out.println("Waiting for upload or download request from client");
Socket socketUpDown = server.accept();
ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
String upDown = (String)request.readObject();
if(upDown.equals("Upload"))
{
upload((String)request.readObject());
}
else if(upDown.equals("Download"))
{
download((String)request.readObject());
}
socketUpDown.close();
}
catch(IOException | ClassNotFoundException e){
e.printStackTrace();
}
}
}
}
import java.io.*;
import java.lang.ClassNotFoundException;
import java.net.*;
public class Server
{
private static ServerSocket server;
private static int port = 8001;
public static void main(String args[]) throws IOException, ClassNotFoundException
{
try
{
server = new ServerSocket(port);
int counter = 0;
System.out.println("Server Started ....");
while(true)
{
counter++;
Socket serverClient = server.accept();
System.out.println("A new client is connected : " + serverClient);
ServerClientThread sct = new ServerClientThread(serverClient, counter);
sct.start();
}
}catch(Exception e){
e.printStackTrace();
}
}
private static class ServerClientThread extends Thread
{
private int clientNo;
public ServerClientThread(Socket socket, int clientNo)
{
this.clientNo = clientNo;
}
public void run()
{
try {
System.out.println("Waiting for upload or download request from client");
Socket socketUpDown = server.accept();
ObjectInputStream request = new ObjectInputStream(socketUpDown.getInputStream());
String upDown = (String)request.readObject();
if(upDown.equals("Upload"))
{
upload((String)request.readObject());
}
else if(upDown.equals("Download"))
{
download((String)request.readObject());
}
socketUpDown.close();
}
catch(IOException | ClassNotFoundException e){
e.printStackTrace();
}
finally{
System.out.println("Client -" + clientNo + " exit!! ");
}
}
public static void upload(String fileName)
{
try {
System.out.println("File Uploading");
Writer out = new BufferedWriter(new OutputStreamWriter(new
FileOutputStream(fileName), "utf-8"));
System.out.println("Created " + fileName);
while(true)
{
System.out.println("Waiting for next line");
Socket socket = server.accept();
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
String message = (String) ois.readObject();
if(message.equalsIgnoreCase("%end%"))break;
out.write(message + "\n");
System.out.println("Message Received: " + message);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject("Received" + message);
ois.close();
oos.close();
socket.close();
}
out.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void download(String fileName)
{
try {
Socket socket = null;
System.out.println("Selected Download");
System.out.println(fileName + " Downloading");
BufferedReader in = new BufferedReader(new FileReader(fileName));
ObjectOutputStream oos = null;
String line = null;
while((line = in.readLine()) != null)
{
try{
socket = server.accept();
oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(line);
System.out.println("Line " + line + " written to file");
oos.close();
Thread.sleep(100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Sending end of file");
Socket endSocket = server.accept();
ObjectOutputStream end = new ObjectOutputStream(endSocket.getOutputStream());
end.writeObject("%end%");
end.close();
in.close();
System.out.println("Shutting down Socket server!!");
server.close();
}
catch(IOException e) {
e.printStackTrace();
}
}
}
}
您正在调用
accept()
两次,并丢弃了第一个结果。谢谢,我发现多次使用accept存在问题。我重新构建了代码以提高效率。我不太明白accept方法到底做了什么,它接受套接字形式的客户端连接。您将第一个接受的套接字传递给ServerClientThread
构造函数,然后将其丢弃,而不是将其存储到类成员中。run()
方法不应再次调用accept()
,它应使用该类成员。