先贴代码:有两个。
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String [] args) {
try {
ServerSocket ss = new ServerSocket(8888);
Socket s = ss.accept();
System.out.println("连接成功");
BufferedReader isr = new BufferedReader( new InputStreamReader(s.getInputStream()) );
PrintWriter osw = new PrintWriter(s.getOutputStream() );
BufferedReader writer = new BufferedReader(new InputStreamReader(System.in) );
String WriteLine = null;
Boolean flag = true;

while(flag) {
if(WriteLine == "88")
flag = false;
osw.write(WriteLine);
osw.flush();
System.out.println("I:"+WriteLine);
if(isr.readLine() !=null) {
System.out.println("Client:" + isr.readLine());
}
WriteLine = writer.readLine(); }
isr.close();
osw.close();
writer.close();
System.out.println("已经断开连接了");
}catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try {
Socket s = new Socket("192.168.1.2",8888);
BufferedReader isr = new BufferedReader(new InputStreamReader(s.getInputStream()) );
PrintWriter osw = new PrintWriter(s.getOutputStream());
BufferedReader writer = new BufferedReader(new InputStreamReader(System.in) );
Boolean flag = true;
String Line = writer.readLine();
while(flag) {
if(Line == "88")
flag = false;
Line = writer.readLine();
osw.write(Line);
osw.flush();
System.out.println("I:" + Line);
if(isr.readLine() != null)
System.out.println("Server:" + isr.readLine());

}
osw.close();
isr.close();
writer.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}我是先运行Server端的,然后再运行Client端,输入一个字符串后就断开连接了。搞了一个多小时。不知道逻辑上哪里搞错了。求解。

解决方案 »

  1.   

    把while里面的顺序调换了一下,还是差不多= =
      

  2.   

    你这程序问题还蛮多的
    看了看,改过之后的如下:
    客户端:import java.io.*;
    import java.net.*;
    public class TCPClient {
        public static void main(String[] args) {
            try {
                Socket s = new Socket("127.0.0.1",8888);            
                BufferedReader isr = new BufferedReader(new InputStreamReader(s.getInputStream()) );
                PrintWriter osw = new PrintWriter(s.getOutputStream());
                BufferedReader writer = new BufferedReader(new InputStreamReader(System.in) );
                String Line = null;
                while(true) {
                    Line = writer.readLine();
                    osw.write(Line + "\n");
                    osw.flush();
                    System.out.println("I:" + Line);
                    if("88".equals(Line)) {
    break;
    }
    String tmpStr = isr.readLine();
                    if("88".equals(tmpStr)) {
                        System.out.println("被服务器给踢了-_-!");
    break;
    } else {
                        System.out.println("Server:" + tmpStr);
    }
                }
                osw.close();
                isr.close();
                writer.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    服务器端:public class TCPServer {
        public static void main(String [] args) {
            try {
                ServerSocket ss = new ServerSocket(8888);
                Socket s = ss.accept();    
                System.out.println("连接成功");        
                BufferedReader isr = new BufferedReader( new InputStreamReader(s.getInputStream()) );
                PrintWriter osw = new PrintWriter(s.getOutputStream() );
                BufferedReader writer = new BufferedReader(new InputStreamReader(System.in) );
                String WriteLine = null;
                
                while(true) {
    String tmpStr = isr.readLine();
    if("88".equals(tmpStr)) {
    System.out.println("客户端请求断开连接");
    break;
    } else {
    System.out.println("Client:" + tmpStr);
    }
    WriteLine = writer.readLine();
    osw.write(WriteLine + "\n");
    osw.flush();
    System.out.println("I:"+WriteLine);
    if("88".equals(WriteLine)) {
    break;
    }
                }
                isr.close();
                osw.close();
                writer.close();
            }catch (Exception e) {    
                e.printStackTrace();
            }
        }
    }
    几点问题:
    1、while循环的退出条件设的不大好,只要一收到要退出的消息后
    直接break就是了。
    2、虽然注意到了socket通信要及时flush,但你会发现很多时候会阻塞
    在BufferedReader的readLine上,原因说了可能很简单:你从终端用BufferedReader
    输入内容时虽然以回车结束,但是返回来的字符串已不带'\n',故若你直接将
    此字符串发送过去的话,对方的BufferedReader中的readLine就会因为读取不到回车而
    阻塞。
    3、很大的问题,例如:
    if(isr.readLine() != null)
        System.out.println("Server:" + isr.readLine());
    你这里在条件判断中读取了socket一次,然后在打印时又读取了一次,而对方
    可是只发送一次数据过来哦,显然会阻塞。
    4、没有正确的关闭流,“经典”过程如下:
    try {
        打开流
    } catch (IOException e) {
        // 处理异常
    } finally {
        if (xxx != null) {
             try {
                 xxx.close();
             } catch (IOException e) {
                 // 异常处理
             }
        }
    }
    5、……建议:楼主加油啊,打好基础。