【JavaEE】TCP数据报套接字编程

编程入门 行业动态 更新时间:2024-10-28 02:25:47

【JavaEE】TCP<a href=https://www.elefans.com/category/jswz/34/1771445.html style=数据报套接字编程"/>

【JavaEE】TCP数据报套接字编程

一、TCP数据报套接字编程

1.1 ServerSocket API

ServerSocket 是创建TCP服务端Socket的API
ServerSocket 构造方法:

ServerSocket 方法:

1.2 Socket API

Socket 是客户端Socket,或服务端中接收到客户端建立连接(accept方法)的请求后,返回的服务端Socket。不管是客户端还是服务端Socket,都是双方建立连接以后,保存的对端信息,及用来与对方收发数据的。
Socket 构造方法:


Socket 方法:

通过上述字节流对象进行数据传输:
InputStream读数据就相当于从网卡接收
OutputStream写数据就相当于从网卡发送

1.3 短连接和长连接

短连接:一次连接只有一个请求
长连接:一次连接有多个请求

1.4 示例一:回显服务器(echo server)

这里我们演示长连接:

1.4.1 Tcp服务器

package Tcp;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.ServerSocket;
import java.Socket;
import java.util.Scanner;public class TcpEchoServer {//serverSocket是外场拉客的小哥,serverSocket有且只有一个//cilentSocket是内场服务的小姐姐,cilentSocket会给每个客户端分配一个private ServerSocket serverSocket = null;public TcpEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服务器启动!");while(true) {Socket cilentSocket = serverSocket.accept();processConnection(cilentSocket);  //连接后通过processConnection来处理连接}}//通过这个方法来处理一个连接://1.读取请求//2.根据请求计算响应//3.把响应返回给客户端private void processConnection(Socket cilentSocket) throws IOException {System.out.printf("[%s:%d] 客户端上线!",cilentSocket.getInetAddress().toString(),cilentSocket.getPort());  //提示客户端上线并打印IP地址和端口号//try()这种写法,允许括号中写多个流对象,中间使用“;”来分割try (InputStream inputStream = cilentSocket.getInputStream();OutputStream outputStream = cilentSocket.getOutputStream()){Scanner scanner = new Scanner(inputStream);  //为了读取请求方便,把字节流转为字符流PrintWriter printWriter = new PrintWriter(outputStream);  //为了返回响应方便,把字节流转为字符流//我们读到哪里算是一个完整的请求呢;//此处做一个简单的约定://每个请求是个字符串(文本数据),每个请求之间使用\n来分割,不要忘记响应也要这样约定while(true) {  //长连接:一次连接有多个请求//1.读取请求if (!scanner.hasNext()) {  //如果客户端关闭连接了,hasNext返回false,结束while循环System.out.printf("[%s:%d] 客户端下线!",cilentSocket.getInetAddress().toString(),cilentSocket.getPort());  //提示客户端下线并打印IP地址和端口号break;}//如果没有读完,直接使用scanner读取一段字符串String request = scanner.next();  //next会往后一直读直到读到空白符(空格、换行符、制表符、翻页符等)结束(不包含空白符)。此处尽量不要使用nextLine//2.根据请求计算响应String response = process(request);  //通过process方法来处理请求并返回响应//3.把响应返回给客户端(不要忘记响应里面也是要带上换行的,方便客户端区分从哪里到哪里是一个响应)printWriter.println(response);System.out.printf("[%s:%d] req:%s ; resp:%s \n",cilentSocket.getInetAddress().toString(), cilentSocket.getPort());}} catch (IOException e) {throw new RuntimeException(e);} finally {cilentSocket.close();  //这里的cilentSocket只是给一个连接提供帮助,所以要及时释放}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {TcpEchoServer tcpEchoServer = new TcpEchoServer(9090);tcpEchoServer.start();}
}

注意:如果没有客户端连接时,accept是会阻塞的

1.4.2 Tcp客户端

package Tcp;import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.Socket;
import java.util.Scanner;public class TcpEchoClient {private Socket socket = null;private void TcpEchoServer(String serverIP, int port) throws IOException {//这个操作就相当于让客户端和服务端建立Tcp连接了socket = new Socket(serverIP,port);}public void start() throws IOException {Scanner scanner = new Scanner(System.in);try (InputStream inputStreamt = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream()){PrintWriter printWriter = new PrintWriter(outputStream);Scanner scanner1 = new Scanner(inputStreamt);while (true) {//1.从键盘上读取用户输入的内容System.out.println("->");String request = scanner.next();//2.把输入的内容构造成请求并发送给服务器(对应服务器的接收)//注意这里发送的请求带有换行printWriter.println(request);//3.从服务器读取相应内容String response = scanner1.next();//4.把响应结果显示在控制台上System.out.printf("req: %s; resp: %s\n", request, response);}}}public static void main(String[] args) throws IOException {TcpEchoClient client = new TcpEchoClient("127.0.0.1", 9090);client.start();}}

更多推荐

【JavaEE】TCP数据报套接字编程

本文发布于:2023-12-04 11:18:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1660737.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数据   JavaEE   TCP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!