日期:2014-05-20  浏览次数:20755 次

TCP socket 问题
我的程序是个小demo。服务器端只接受,客户端只发送。
服务器端:

ServerSocket ss = null;
try{
ss = new ServerSocket(2222);
while(true){
Socket socket = ss.accept();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("客户端说:"+reader.readLine());
}
}catch (Exception e) {
e.printStackTrace();
}finally{
try{
if(ss!=null)
ss.close();
}catch (Exception e) {
}
}

客户端:

Socket socket = null;
try{
socket = new Socket("127.0.0.1", 2222);
System.out.println("连接已建立");
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
while(true){
writer.write("我是客户端..\\r\\n");
writer.flush();
Thread.sleep(3000);
                                System.out.println("发送完毕...");
}
}catch (Exception e) {
e.printStackTrace();
}finally{
try {
if(socket!=null)
socket.close();
} catch (IOException e) {
}
}

问题是,如果客户端只发一次(就是没有while循环),服务器端是可以收到的,但是如果这样循环发的话,服务器端一次都没有收到。我的debug发现是服务器端一直阻塞在readLine,也就是说客户端发送的东西并没有到达服务器端。但是客户端确实显示循环的"发送完毕"。
------最佳解决方案--------------------

ss = new ServerSocket(1212);
Socket socket = ss.accept();//放在外面
while (true) {
BufferedReader reader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
System.out.println("客户端说:" + reader.readLine());
}



while (true) {
writer.write("我是客户端..\\r\\n");
writer.newLine();//加上这个:写入一个行分隔符
writer.flush();
Thread.sleep(3000);
System.out.println("发送完毕...");
}


可以到达你的想法了。
------其他解决方案--------------------
服务器这里在accept方法上阻塞了。 把accept拿到while循环前
------其他解决方案--------------------
4楼正解   主要是客户端 socket = new Socket("127.0.0.1", 2222);要放到循环体里  每次都要建立新连接 否则服务器会出现connection reset 
------其他解决方案--------------------
这个应该用两个线程来做
------其他解决方案--------------------
你\n的转义有问题。首先readLine是以\n或是\r为结尾的一行字符串。你是\\r与\\n将其转义 已经不是结束符。并且你这个程序只能读一次。因为客户端第二次发送时。服务器会阻塞在accept这个方法上。
------其他解决方案--------------------
客户端点ctrl+c结束进程后服务站就会出来内容了。
------其他解决方案--------------------
没有处理并发问题。我是每次连接都建一个套接字。
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
public static void main(String[] args){
        ServerSocket ss = null;
        try{

            ss = new ServerSocket(2222);