第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > java socket实现简易客户端服务端通信

java socket实现简易客户端服务端通信

时间:2019-08-24 20:05:25

相关推荐

java socket实现简易客户端服务端通信

这是最近学的socket实现的简易的客户端和服务端,基本功能是客户端发送消息到服务器,服务器接收消息后计算字符数量再回送给客户端.记录一下一些代码的涵义.

客户端

package capter1;import java.io.*;import .Inet4Address;import .InetSocketAddress;import .Socket;public class Client {public static void main(String[] args) throws IOException {Socket socket = new Socket();// 超时时间socket.setSoTimeout(3000);// 连接本地,端口2000;超时时间3000mssocket.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 input = new BufferedReader(new InputStreamReader(in));// 得到Socket输出流,并转换为打印流OutputStream outputStream = client.getOutputStream(); //获取客户端发送出去的信息PrintStream socketPrintStream = new PrintStream(outputStream);// 得到Socket输入流,并转换为BufferedReaderInputStream inputStream = client.getInputStream(); //获取服务器发送来的信息BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));boolean flag = true;do {// 键盘读取一行String str = input.readLine();// 发送到服务器socketPrintStream.println(str);// 从服务器读取一行String echo = socketBufferedReader.readLine();if ("bye".equalsIgnoreCase(echo)) {flag = false;}else {System.out.println(echo);}}while (flag);// 资源释放socketPrintStream.close();socketBufferedReader.close();}}

其中InetAddress表示IP地址,无论是IPV4,还是IPV6,Inet4Address表示IPV4,Inet6Address表示IPV6。

SocketAddress表示不依赖于具体协议的套接字地址抽象,InetSocketAddress表示IP地址的套接字地址,包含IP地址和端口号。

这里是创建一个套接字对象socket,setSoTimeout()是用来设置超时时间,connect()方法用来连接到指定IP地址和端口的server,它需要传入SocketAddress对象和超时时间的参数,这里是新建了一个InetSocketAddress对象,InetSocketAddress继承自SocketAddress,简单说就是connect()传入了包含IP地址和端口号的InetSocketAddress对象以及一个超时时间参数.socket.getOutputStream()作用是获取客户端发送出去的信息,socket.getInputStream()则是获取服务器发送来的信息.

服务端

package capter1;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintStream;import .ServerSocket;import .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;}@Overridepublic void run() {super.run();System.out.println("新客户端连接:" + socket.getInetAddress() +" P:" + socket.getPort());try {// 得到打印流,用于数据输出;服务器回送数据使用PrintStream socketOutput = new PrintStream(socket.getOutputStream());// 得到输入流,用于接收数据BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));do {// 客户端拿到一条数据String str = socketInput.readLine();if ("bye".equalsIgnoreCase(str)) {flag = false;// 回送socketOutput.println("bye");} else {// 打印到屏幕。并回送数据长度System.out.println(str);socketOutput.println("回送:" + str.length());}} while (flag);socketInput.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());}}}

客户端弄明白服务端的原理也差不多,这里的区别只是服务端开了个线程来处理接收和发送消息.

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。