先贴代码:有两个。
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端,输入一个字符串后就断开连接了。搞了一个多小时。不知道逻辑上哪里搞错了。求解。
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端,输入一个字符串后就断开连接了。搞了一个多小时。不知道逻辑上哪里搞错了。求解。
看了看,改过之后的如下:
客户端: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、……建议:楼主加油啊,打好基础。