Java中Socket 实现最简单的客户端与服务端通信
Java中Socket 实现最简单的客户端与服务端通信
引言:因为最近项目中要接入某通信协议接口,基于TCP/IP的socket接口。于是就在本地弄一个最简单的Socket 通信仅供学习。话不多说,直接开摆
客户端代码
package test; import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.Socket; public class Client { //java基础类方法的入口 public static void main(String[] args)throws IOException { Socket socket=new Socket(); //读取流超时的时间设置为3000 socket.setSoTimeout(3000); //连接本地,端口2000;超时时间3000ms socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), 2000),3000); System.out.println("发起服务器连接---------"); System.out.println("客户端信息:"+socket.getLocalAddress()+" P:"+socket.getLocalPort());//打印本地服务器地址和本地端口号 System.out.println("服务端信息:"+socket.getInetAddress()+" P:"+socket.getPort()); try{ //发送接收数据 todo(socket); }catch (Exception e){ System.out.println("出现异常关闭啦"); } //释放资源 socket.close(); System.out.println("再见,客户端已退出"); } //发送数据的方法 private static void todo(Socket client) throws IOException{ //构建键盘输入流 InputStream in=System.in; //把键盘输入流转换为BufferedReader BufferedReader input=new BufferedReader(new InputStreamReader(in,"UTF-8")); //得到Socket输出流(Client要发送出去给服务器的信息),并转换为打印流 OutputStream outputStream = client.getOutputStream(); PrintStream socketPrintStream=new PrintStream(outputStream); //得到Socket输入流(Server回复传入Client的信息),并转换为BufferedReader InputStream inputStream = client.getInputStream(); BufferedReader socketBufferedReader=new BufferedReader(new InputStreamReader(inputStream,"UTF-8")); //判断Server是否想要退出,回复“bye”时是他想要结束对话 boolean flag=true; do { //键盘读取一行 String str = input.readLine(); //发送到服务器,(通俗就是显示在输入处,在键盘上输入什么,屏幕显示什么) //String str = "003099999920220614100000M1S1C0x0a"; socketPrintStream.println(str); //从服务器读取一行,即Server传入回复给Client的信息 String echo = socketBufferedReader.readLine(); if("bye".equalsIgnoreCase(echo)){ flag=false; } else{ //打印到屏幕上,Server回复什么就显示什么 System.out.println("客户端回复:"+echo); } }while(flag); //资源释放,关闭对于socket资源 socketPrintStream.close(); socketBufferedReader.close(); } }
服务端代码
package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args)throws IOException { ServerSocket server=new ServerSocket(2000); System.out.println("服务器准备就绪----------"); System.out.println("服务器信息:"+server.getInetAddress()+" P:"+server.getLocalPort()); //等待多个客户端连接,循环异步线程 for(;;) { //得到客户端 Socket client = server.accept(); //客户端构建异步线程 ClientHandler clientHandler = new ClientHandler(client); //启动线程 clientHandler.start(); } } /** * 客户端消息处理 */ //多个客户端需要做异步操作,建立异步处理类 private static class ClientHandler extends Thread{//线程 private Socket socket;//代表当前的一个连接 private boolean flag=true; ClientHandler(Socket socket){ this.socket=socket; }//构造方法 //一旦Thead启动起来,就会运行run方法,代表线程启动的部分 @Override public void run(){ super.run(); //打印客户端的信息 System.out.println("新客户端发起连接:"+socket.getInetAddress()+" P:"+socket.getPort()); //在发送过程中会触发一个IO过程,所以需要捕获异常 try { //得到打印流,用于数据输出,服务器回送数据使用,即在屏幕上显示Server要回复Client的信息 PrintStream socketOutput=new PrintStream(socket.getOutputStream()); //得到输入流,用于接收数据,得到Client回复服务器的信息 BufferedReader sockeInput=new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8")); do { //客户端回复一条数据 String str = sockeInput.readLine(); if("bye".equalsIgnoreCase(str)){ flag=false; //回送 socketOutput.println("bye"); }else{ //打印到屏幕,并回送数据长度 System.out.println(str); socketOutput.println("Server回答说:" +str.length()); } }while(flag); sockeInput.close(); socketOutput.close(); }catch (Exception e){ //触发异常时打印一个异常信息 System.out.println("连接异常断开!!!"); }finally { //连接关闭 try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } System.out.println("再见,客户端退出:"+socket.getInetAddress()+" P:"+socket.getPort()); } } }
然后先运行服务端类Server.java,然后再运行Client.java
在客户端控制台输入任意文字,按下回车键即可。
为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/