转载请注明出处:http://hi.baidu.com/leejun_2005/blog/item/3a4f1ddc374359c58c1029e9.html
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) {
try {
//在本机指定端口 5778 创建一个服务端 socket
ServerSocket server = new ServerSocket(5778);
//服务端始终侦听来自客户端的请求,因此这种方式是阻塞式的
Socket client = server.accept();
//将收到的数据再转发给发送者
PrintWriter out = new PrintWriter(client.getOutputStream());
//从IO节点流(低级流)中读取数据并转换为处理流(高级流)
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
//死循环不断处理客户端的数据,如果要处理多客户端的请求数据,需要多线程或者NIO的非阻塞Socket
while(true){
//将客户端送来的数据从处理流中读出
String str = in.readLine();
//打印到当前标准输出:屏幕
System.out.println(str);
//将收到的数据回显给客户端
out.println("------------------------Server has received client data: "+str);
//数据默认先放到IO缓存中,flush后才送出
out.flush();
//遇到 end 字符串就退出程序
if(str.equals("end")){
break;
}
}
//记得关闭各种物理资源,java的 GC 只能回收内存资源
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
//客户端在 TCP 连接模型中需要根据服务端的 IP 与端口号,主动发起连接
Socket server = new Socket(InetAddress.getLocalHost(),5778);
//封装节点IO流,准备用于接收服务端的回显数据
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream()));
//准备接收来自键盘的用户输入
BufferedReader wt = new BufferedReader(new InputStreamReader(System.in));
//准备将用户的输入发送给服务端
PrintWriter out = new PrintWriter(server.getOutputStream());
//不断的接收用户输入
while(true){
//读出用户刚才的输入
String str = wt.readLine();
//将用户的输入发送给服务端
out.println(str);
//数据默认在缓存中,需要显示 flush
out.flush();
//遇到 end 字符串就退出程序
if(str.equals("end")){
break;
}
//在标准输出上打印从服务端接收到的数据
System.out.println(in.readLine());
}
//记得关闭各种物理资源,java的 GC 只能回收内存资源
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}