这个代码给你参考一下吧,以前有人提问的帖子拷的 public class SocketServer { public void start() { try{ ServerSocket ss = new ServerSocket(10000); System.out.println("等待客户端连接"); int i = 1; while(true){ Socket s = ss.accept(); System.out.println("第"+String.valueOf(i)+"客户端连接进来了"); InceptFileThread ifThread = new InceptFileThread(s, i); ifThread.start(); i++; } } catch (IOException e){ e.printStackTrace(); } }
public static void main(String[] args) { SocketServer ss = new SocketServer(); ss.start(); } }class InceptFileThread extends Thread { private Socket s; private int fileNumber;
public InceptFileThread(Socket s, int fileNumber){ this.s = s; this.fileNumber = fileNumber; }
public void run(){ try{ DataInputStream is = new DataInputStream(s.getInputStream()); //BufferedReader br = new BufferedReader(new InputStreamReader(is)); System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传"); String fileName = is.readUTF();//.readLine(); System.out.println("文件名称"+fileName); String fileSizeStr = is.readUTF();//.readLine(); System.out.println("文件长度"+fileSizeStr); StringBuilder filePath = new StringBuilder(); filePath.append("c://file") .append(fileNumber); File fileCatalog = new File(filePath.toString()); if(!fileCatalog.exists()) fileCatalog.mkdirs(); filePath.append("//").append(fileName); File file = new File(filePath.toString()); //FileOutputStream fos = new FileOutputStream(file); DataOutputStream fos = new DataOutputStream(new FileOutputStream(file)); byte[] buffer = new byte[1024]; System.out.println("开始接收文件"); int len = 0; while((len = is.read(buffer,0,1024)) != -1){ fos.write(buffer,0,1024); fos.flush(); } is.close(); fos.close(); System.out.println("文件"+fileNumber+"上传完毕"); } catch (IOException e) { e.printStackTrace(); } } }
System.out.println(clientSendContent.readLine()); 这行不是在循环中那就只读取一次。
你应该用一个循环来处理这个 socketSendContent 读取到的东西。
如果需要能同时处理多个客户端,就需要把这个 Socket 交给另一个线程来处理,服务端主线程接着进行 serverSocket.accept() 等待另一个客户端请求。
while (true)
{
Socket socketClient = serverSocket.accept();
System.out.println(socketClient.getInetAddress());
BufferedReader clientSendContent = new BufferedReader(new InputStreamReader(
socketClient.getInputStream()));
System.out.println(clientSendContent.readLine());
}
这个也要循环
while(clientSendContent.readLine() != null){
System.out.println(clientSendContent.readLine());
}
我明明循环了啊,各位大哥看看我的代码啊,我都放在while循环里面了
不是,我调试后发现在accept的地方,就已经不动了。
readLine方法也是阻塞的啊
我的意思是,当我客户端发送数据后,accept也不动,也就是不能accept数据
Socket socketClient = serverSocket.accept();
System.out.println(socketClient.getInetAddress());
BufferedReader clientSendContent = new BufferedReader(new InputStreamReader(
socketClient.getInputStream()));
这三句话挪到循环外面。
public class SocketServer { public void start()
{
try{
ServerSocket ss = new ServerSocket(10000);
System.out.println("等待客户端连接");
int i = 1;
while(true){
Socket s = ss.accept();
System.out.println("第"+String.valueOf(i)+"客户端连接进来了");
InceptFileThread ifThread = new InceptFileThread(s, i);
ifThread.start();
i++;
}
} catch (IOException e){
e.printStackTrace();
}
}
public static void main(String[] args)
{
SocketServer ss = new SocketServer();
ss.start();
}
}class InceptFileThread extends Thread { private Socket s;
private int fileNumber;
public InceptFileThread(Socket s, int fileNumber){
this.s = s;
this.fileNumber = fileNumber;
}
public void run(){
try{
DataInputStream is = new DataInputStream(s.getInputStream());
//BufferedReader br = new BufferedReader(new InputStreamReader(is));
System.out.println("第"+String.valueOf(fileNumber)+"个文件开始上传");
String fileName = is.readUTF();//.readLine();
System.out.println("文件名称"+fileName);
String fileSizeStr = is.readUTF();//.readLine();
System.out.println("文件长度"+fileSizeStr);
StringBuilder filePath = new StringBuilder();
filePath.append("c://file")
.append(fileNumber);
File fileCatalog = new File(filePath.toString());
if(!fileCatalog.exists())
fileCatalog.mkdirs();
filePath.append("//").append(fileName);
File file = new File(filePath.toString());
//FileOutputStream fos = new FileOutputStream(file);
DataOutputStream fos = new DataOutputStream(new FileOutputStream(file));
byte[] buffer = new byte[1024];
System.out.println("开始接收文件");
int len = 0;
while((len = is.read(buffer,0,1024)) != -1){
fos.write(buffer,0,1024);
fos.flush();
}
is.close();
fos.close();
System.out.println("文件"+fileNumber+"上传完毕");
} catch (IOException e) {
e.printStackTrace();
}
}
}
把你服务器端while里面的内容除了System.out.println(clientSendContent.readLine());
其余都弄到外面试试
如果连接断开了重新连
{
Socket socketClient = serverSocket.accept(); // 等待一个客户端
System.out.println(socketClient.getInetAddress());
BufferedReader clientSendContent = new BufferedReader(new InputStreamReader(
socketClient.getInputStream()));
System.out.println(clientSendContent.readLine()); //读取这个客户的第一行,那第二行在哪儿读取呢?你这句代码仅读取了第一行之后就回到上面去 accept 等待另一个客户端,而之前的那一个客户端没有人理会。你需要把这一行代码连同人个 Socket 客户端对象交给另一个线程去单独处理它的内容。例如: new Worker(socket).start(); // 开启一个 worker 线程处理这个客户端的 I/O 情况。之后我们的 ServerSocket 主线程继续监听另一个客户端的请求。
} class Worker extends Thread { // 这只是一个简化版本,实现上这么简单的设计会有很多意想不到的问题。可以自己运行几次,同时用 Process Explorer 从进程中故意 Kill 掉一个客户端来查看 TCP 连接意外断开(比如掉线)时会出现什么情况,你的服务器是不是够健壮(不健壮的服务器表现为:直接异常退出了,或没有日志用于诊断问题)。另外需要说明的是 Socket 现在都是全双工,如果你同时有 Input 和 Output 而且与客户端没有约定数据交换的次序的话,那就需要同时为 Input 和 Ouput 各开一个线程去处理,当然这种情况也可以用 Java 1.4 开始提供的 NIO (New IO) 的 Socket Channel /Selector 去处理(它不用每个 socket 或 I/O 多开线程而是用对各个 Socket 执行轮询,有事件发生时才工作,因为基本网络不可以忙到每时每刻每个 socket 都有事情做的地步)。 private Socket client;
Worker(Socket client) { this.client = client;}
public void run () {
while(true){
System.out.println(clientSendContent.readLine());
}
}
}