一.通过Socket实现TCP编程
1.1 TCP编程
TCP协议是面向连接,可靠的,有序的,以字节流的方式发送数据。基于TCP协议实现网络通信的类有客户端的Socket类和服务器端的ServerSocket类。
1.2 服务器端套路
1.创建ServerSocket对象,绑定监听端口。
2.通过accept()方法监听客户端请求。
3.连接建立后,通过输入流读取客户端发送的请求信息。
4.通过输出流向客户端发送响应信息。
5.关闭响应的资源。
1.3 客户端套路
1.创建Socket对象,指明需要连接的服务器的地址和端口号。
2.连接建立后,通过输出流向服务器发送请求信息。
3.通过输入流获取服务器响应的信息。
4.关闭相应资源。
1.4 多线程实现服务器与多客户端之间通信步骤
1.服务器端创建ServerSocket,循环调用accept()等待客户端连接。
2. 客户端创建一个socket并请求和服务器端连接。
3.服务器端接受客户端请求,创建socket与该客户建立专线连接。
4.建立连接的两个socket在一个单独的线程上对话。
5.服务器端继续等待新的连接。
1.5 创建处理线程类ServerThread
这里选择实现runnable接口而不是继承Thread是因为一个类只能继承一个父类,当我需要继承其他类的时,父类就就不好处理了。
packagecom.tzzh;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.io.OutputStream;importjava.io.PrintWriter;importjava.net.Socket;public class ServerThread implementsRunnable{
Socket socket= null;//和本线程相关的Socket
publicServerThread(Socket socket) {this.socket =socket;
}
@Overridepublic voidrun() {
InputStream is= null;
InputStreamReader isr= null;
BufferedReader br= null;
OutputStream os= null;
PrintWriter pw= null;try{//与客户端建立通信,获取输入流,读取取客户端提供的信息
is =socket.getInputStream();
isr= new InputStreamReader(is,"GBK");
br= newBufferedReader(isr);
String data= null;while((data=br.readLine()) != null){//循环读取客户端的信息
System.out.println("我是服务器,客户端提交信息为:"+data);
}
socket.shutdownInput();//关闭输入流//获取输出流,响应客户端的请求
os =socket.getOutputStream();
pw= newPrintWriter(os);
pw.write("服务器端响应成功!");
pw.flush();
}catch(IOException e) {
e.printStackTrace();
}finally{//关闭资源即相关socket
try{if(pw!=null)
pw.close();if(os!=null)
os.close();if(br!=null)
br.close();if(isr!=null)
isr.close();if(is!=null)
is.close();if(socket!=null)
socket.close();</