Java Tcp(Socket、ServerSocket)

article/2025/10/15 1:57:49

TCP所提供服务的主要特点:

  • 面向连接的传输;
  • 端到端的通信;
  • 高可靠性,确保传输数据的正确性,不出现丢失或乱序;
  • 全双工方式传输;
  • 采用字节流方式,即以字节为单位传输字节序列;

TCP传输需要建立客户端和服务器端,即Socket和Server Socket,建立连接后,通过Socket中的IO流进行数据的传输。传输结束后关闭Socket。

package com.demo.test;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;class TcpDemo {private static String SERVER_ADDR = "127.0.0.1";private static int PORT = 7777;private static String EXIT = "exit";static class TcpServerThread extends Thread {static class TcpClient {private Socket socket;private BufferedReader br;private BufferedWriter bw;public TcpClient(Socket socket) throws IOException {this.socket = socket;br = new BufferedReader(new InputStreamReader(socket.getInputStream()));bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));}public String readLine() throws IOException {if (br != null) {return br.readLine();}return null;}public void write(String str) throws IOException {if (bw != null) {bw.write(str + "\n");// 注意:刷新是关键,否则会等到缓冲区满才将数据实际地发送出去bw.flush();}}public void close() {if (br != null) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (bw != null) {try {bw.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}private ArrayList<TcpClient> clientList = new ArrayList<TcpClient>();private ServerSocket serverSocket;@Overridepublic void run() {try {// backlog=-1表示无限制,默认是50个最大等待队列,如果设置无限制,由于每一个TCP连接都会占用服务器的内存,当服务器无法处理那么多连接时,就会让服务器崩溃。int backlog = -1;serverSocket = new ServerSocket(PORT, backlog);Socket socket = null;while ((socket = serverSocket.accept()) != null) {System.out.println("server accept");final TcpClient tcpClient = new TcpClient(socket);clientList.add(tcpClient);new Thread(new Runnable() {@Overridepublic void run() {try {String line;while ((line = tcpClient.readLine()) != null) {System.out.println("serverSocket received: " + line);tcpClient.write(line);if (EXIT.equals(line)) {break;}}} catch (IOException e) {e.printStackTrace();} finally {close();}}}).start();}} catch (IOException e) {e.printStackTrace();}}public void close() {for (TcpClient client : clientList) {client.close();}try {if (serverSocket != null) {serverSocket.close();}} catch (IOException e) {e.printStackTrace();}}}static class TcpClientThread extends Thread {private Socket socket;private BufferedReader br;private BufferedWriter bw;private Scanner scanner;@Overridepublic void run() {try {socket = new Socket(SERVER_ADDR, PORT);br = new BufferedReader(new InputStreamReader(socket.getInputStream()));bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));scanner = new Scanner(System.in);new Thread(new Runnable() {@Overridepublic void run() {try {String line;while ((line = br.readLine()) != null) {System.out.println("client received: " + line);if (EXIT.equals(line)) {break;}}} catch (IOException e) {e.printStackTrace();} finally {closeSocket();}}}).start();Timer timer = new Timer();timer.schedule(new TimerTask() {@Overridepublic void run() {try {bw.write("hello world\n");// 注意:刷新是关键,否则会等到缓冲区满才将数据实际地发送出去bw.flush();System.out.println("client write");} catch (IOException e) {e.printStackTrace();// 发生错误立刻取消定时器this.cancel();}}}, 0, 5000);String line;while (scanner.hasNext()) {line = scanner.nextLine();bw.write(line + "\n");// 注意:刷新是关键,否则会等到缓冲区满才将数据实际地发送出去bw.flush();if (EXIT.equals(line)) {break;}}} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {closeSocket();}}private void closeSocket() {if (scanner != null) {scanner.close();}if (br != null) {try {br.close();} catch (IOException e) {e.printStackTrace();}}if (bw != null) {try {bw.close();} catch (IOException e) {e.printStackTrace();}}if (socket != null) {try {socket.close();} catch (IOException e) {e.printStackTrace();}}}}public static void main(String[] args) {new TcpServerThread().start();new TcpClientThread().start();}
}

这里写图片描述

这里需要格外注意一点:如果没有调用flush(),数据只会被写入输出缓冲区,并不会从输出缓冲区发送到输出流中,因此另一方也就不可能接收到数据


http://chatgpt.dhexx.cn/article/hUvxP9ht.shtml

相关文章

【Socket】Java Socket通信(一)

前段时间在网上学习了Java Socket的应用编程。 端口 用于区分不同应用程序端口号范围065535&#xff0c;其中01023为系统所保留IP地址和端口号组成了所谓的Socket&#xff0c;Socket是网络上运行的程序之间双向通信链路的终结点&#xff0c;是TCP和UDP的基础http&#xff1a;…

java socket编程总结

java socket编程总结 说明一、TCP/IP协议模型二、获取IP相关信息InetAddressInetSocketAddressURL 三、TCP编程四、UDP编程五、关于TCP与UDP 说明 更新时间&#xff1a;2020/12/01 17:17&#xff0c;更新完基本内容 java的socket编程做一个总结&#xff0c;主要是面向Tcp和Ud…

Java Socket网络编程,你要的实验,我都有

JAVA Socket编程 目录 JAVA Socket编程多人聊天室客户端源代码服务器端源代码运行展示 邮件发送客户端运行展示 在线云笔记客户端窗口服务器端代码运行展示 多人聊天室 客户端源代码 import java.awt.BorderLayout; import java.awt.HeadlessException; import java.awt.event…

【Java高级】初探socket编程 ——JavaSocket连接与简单通信

新学期生活开始一段时间了&#xff0c;要继续学习一些新的技术&#xff08;这里指socket /doge&#xff09;&#xff0c;目标是尝试完成一个在线即时聊天的小程序&#xff08;尽量不咕&#xff09;。会更新一系列socket编程的技术文章&#xff0c;欢迎关注交流~ 那么千里之行&…

Java--Socket通信(双向,有界面)

服务端&#xff1a; import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

JAVA 网络编程 Socket

网络&#xff1a;相互连接的计算机&#xff0c;带来的好处有共享资源&#xff0c;交换数据 IP地址&#xff1a;定位计算机地址 通常由网络地址主机地址组合 查看本机IP地址&#xff1a;电脑左下角输入CMD&#xff0c;回车在CMD界面输入ipconfig 127.0.0.1 测试本机网络配置 …

初识Java Socket编程

Java最初是作为网络编程语言出现的&#xff0c;其对网络提供了高度的支持&#xff0c;使得客户端和服务器的沟通变成了现实&#xff0c;而在网络编程中&#xff0c;使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。下面就让我们一起揭开Socket的神秘面纱。…

Java socket详解,看这一篇就够了

刚给大家讲解Java socket通信后&#xff0c;好多童鞋私信我&#xff0c;有好多地方不理解&#xff0c;看不明白。特抽时间整理一下&#xff0c;详细讲述Java socket通信原理和实现案例。整个过程楼主都是通过先简单明了的示例让大家了解整个基本原理&#xff0c;后慢慢接近生产…

递归下降文法C语言实验报告,递归下降分析法的简单例子的c语言实现

我们举的简单例子是 G[s]: S → a | ∧ | (T) T→T, S | S 转化为LL1文法 S →a |∧| (T) T →ST T→,ST| ε c语言代码实现 #include char scaner(char*input,int* p); void S(char*input,int* p); void T(char*input,int* p); void T1(char*input,int* p); void error(); int…

C++:编译实验之递归下降分析器

一、实验目的 1.加深对递归下降分析法一种自顶向下的语法分析方法的理解。 2.根据文法的产生式规则消除左递归&#xff0c;提取公共左因子构造出相应的递归下降分析器。 二、实验内容 根据课堂讲授的形式化算法&#xff0c;编制程序实现递归下降分析器&#xff0c;能对常见…

递归下降分析程序的设计和实现

递归下降分析程序的设计和实现 一、实验的目的和要求 1、了解语法分析的主要任务。 2、实现基本的递归下降分析器&#xff0c;能够分析任意的符号串是否为该文法所定义的合法算术表达式。二、实验环境 Windows7 Dev-C三、实验准备 先将递归下降分析程序的生成认真的学习一…

利用递归下降分析方法完成语法分析

一、 程序设计题目与说明 利用递归下降分析方法完成语法分析。 递归下降分析法是一种自顶向下的分析方法&#xff0c;文法的每个非终结符对应一个递归过程&#xff08;函数&#xff09;。分析过程就是从文法开始符出发执行一组递归过程&#xff08;函数&#xff09;&#xff…

编译原理 --- 递归下降分析器

第一部分 --- 构造递归下降分析器 1.在上面这个例子中则是子程序序A先调用子程序B&#xff0c;本程序结束完调用之后再返回来继续调用下一个符号 如果下一个符号是终结符的话那就直接进行匹配&#xff0c;不进行调用&#xff0c;匹配完后继续调用下一个符号 如果不是的话则调…

递归下降分析法实现强化计算器

一. 实验概述 1.使用bison 和 flex 实现扩展版计算器 该计算器支持实型的两种表达,分别是小数和科学计数法. 该计算器支持 加, 减, 乘 除 四种运算 和括号()运算符. 该计算器支持整形,实型混合运算 2.通过递归下降分析法自行编写的语法分析和使用flex进行的词法分析的计算器.…

编译原理研究性学习专题 2——递归下降语法分析设计原理与实现

1 实验内容 完成以下描述赋值语句的 LL(1)文法的递归下降分析程序 G[S]: S→ VE E→ TE’ E’→ ATE’ | e T→ FT’ T’→ MFT’ | E F→ (E) | i A→ | - M→ * | / V→ i 设计说明&#xff1a;终结符号 i 为用户定义的简单变量&#xff0c;即标识符的定义。 2 实验要求 …

Python技法之简单递归下降Parser的实现方法

文章目录 一. 算术运算表达式求值二. 生成表达式树三、左递归和运算符优先级陷阱四. 相关包 一. 算术运算表达式求值 对于简单的算术运算表达式&#xff0c;假定我们已经用分词技术将其转化为输入的tokens流&#xff0c;如NUMNUM*NUM。 在此基础上&#xff0c;我们定义BNF规则…

编译实验 . 递归下降分析器

实验目的&#xff1a; 1.1掌握语法分析方法。 1.2掌握使用算符优先分析法。 1.3完成语法分析程序的设计和实现。 1.4程序能完成对指定语言的语法分析。 2. 递归下降分析器 在不含左递归和每个非终结符的所有候选终结首符集都两两不相交的条件下&#xff0c;我们就可能构造…

用c语言编译递归下降翻译器,Java实现C语言语义分析(递归下降)

说起这次的语义分析&#xff0c;不得不说的是我的重大的改变。上一次的语法分析是利用了预测分析法来实现的&#xff0c;经过多方考证&#xff0c;发现用预测分析法的语法分析器基础来实现语义分析的困难重重&#xff0c;例如在语法指导翻译的时候那个栈的变化和各种属性的传递…

递归下降分析法

介绍&#xff1a; 递归下降分析法是针对LL(1)文法的一种语法分析方法&#xff1b; 通过对文法的消除左递归&#xff0c;提取左公因子&#xff0c;对各个产生式和非终结符求first()和follow()集&#xff0c;通过first()和follow()集构造该文法的预测分析表&#xff0c;当这个预…

编译原理实验-递归下降语法分析

具体代码已放至Github&#xff08;仅供参考&#xff09;&#xff1a; qxpBlog/Compiler_UESTC: 电子科技大学编译原理实验 (github.com) 具体实验过程如下&#xff1a; 一、实验目的、原理、内容及步骤&#xff1a; &#xff08;1&#xff09;目的&#xff1a;通过本实验加深…