Socket通信:
TCP协议是面向连接、可靠的、有序的,以字节流的方式发送数据。
基于TCP协议实现网络通信的类:
客户端的socket类
服务器端的ServerSocket类
一、Socket通信实现步骤:
1、创建ServerSocket和Socket
2、打开连接到Socket的输入/输出流
3、按照协议对Socket进行读/写操作
4、关闭输入输出流、关闭Socket
建立:
服务器端:
1、创建ServerSocket对象,绑定监听端口
2、通过accept()方法监听客户端需求
3、建立连接后,通过输入流读取客户端发送的信息
4、通过输出流响应客户端
5、关闭相应资源
/** * 基于TCP协议的Socket通信 * 客户端 * @author dell2014 */ public class Server { public static void main(String[] args){ try { //1.创建一个服务器端的ServerSocket,指定绑定的端口,并监听此端口 ServerSocket serverSocket = new ServerSocket(8888); //2.调用accept()方法监听,等待客户端连接 System.out.println("***服务器即将启动,等待客户端连接***"); Socket socket = serverSocket.accept(); //3.获取输入流,用来读取客户端发送的信息 InputStream is = socket.getInputStream();//字节输入流 InputStreamReader isr = new InputStreamReader(is);//转化为字符流 BufferedReader br = new BufferedReader(isr); String info = null; while( (info = br.readLine()) != null){//循环读取信息 System.out.println("这是服务器,客户端说:"+info); } socket.shutdownInput();//关闭输入流 //4.获取输出流,响应客户端请求 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os);//包装为打印流 pw.write("welcome!"); pw.flush();//刷新缓存,输出 //5.关闭资源 pw.close(); os.close(); br.close(); isr.close(); is.close(); socket.close(); serverSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
客户端:
1、创建Socket对象,指明需要连接的服务器的地址和端口号
2、连接建立后,通过输出流向服务器端发送请求信息
3、通过输入流获取服务器响应的信息
4、关闭相应资源
/** * 基于TCP协议的Socket通信 * 客户端 * @author dell2014 */ public class Client { public static void main(String[] arg){ try { //1.创建客户端Socket,指定服务器地址和端口 Socket socket = new Socket("localhost",8888); //2.获取输出流,向服务器发送信息 OutputStream os = socket.getOutputStream();//字节输出流 PrintWriter pw = new PrintWriter(os);//将输出流打包为打印流 pw.write("用户名:admin;密码:123"); pw.flush();//刷新缓存,向服务器发送信息 socket.shutdownOutput();//关闭输出流 //3.获取输入流,并读取服务器端响应信息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String info = null; while( (info = br.readLine()) != null){//循环读取信息 System.out.println("这是客户端,服务器端说:"+info); } //4.关闭资源 br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
服务器端:
***服务器即将启动,等待客户端连接***
这是服务器,客户端说:用户名:admin;密码:123
客户端:
这是客户端,服务器端说:welcome!
二、多线程服务器:
应用多线程来实现服务器与客户端的通信
基本步骤
1、服务器端创建ServerSocket,循环调用accept() 等待客户端连接
2、客户端创建一个Socket并请求和服务器端连接
3、服务器接受客户端请求,创建socket与该客户端建立专线连接
4、建立连接的两个socket在一个单独的线程上对话
5、服务器继续等待新的连接
/** * 服务器端线程处理类 * @author dell2014 * */ public class ServerThread extends Thread { //和本线程相关的socket Socket socket=null; public ServerThread(Socket socket){ this.socket = socket; } //线程执行操作,响应客户端请求(重写run方法) @SuppressWarnings("null") public void run(){ InputStream is = null; BufferedReader br = null; OutputStream os = null; PrintWriter pw = null; try { is = socket.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); String info = null; while( (info = br.readLine()) != null){ System.out.println("这是服务器,客户端说:"+info); } socket.shutdownInput(); os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("welcome!"); pw.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{//最终一定执行代码,关闭资源 try { if(pw != null) pw.close(); if(os != null) os.close(); if(br != null) br.close(); if(pw != null) is.close(); if(pw != null) socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
/** * 基于TCP协议的Socket通信 * 客户端 * @author dell2014 */ public class Server { public static void main(String[] args){ try { ServerSocket serverSocket = new ServerSocket(8888); Socket socket = null; int count = 0;//记录连接数量 System.out.println("***服务器即将启动,等待客户端连接***"); //循环监听等待客户端连接 while(true){ socket = serverSocket.accept(); //创建一个新线程 ServerThread serverThread = new ServerThread(socket); //启动线程 serverThread.start(); //统计客户端数量并输出 count++; System.out.println("客户端连接数量:"+count); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }