TCP程序设计基础

news2024/11/15 13:57:42

TCP网络程序设计是指用Socket类编写通信程序。利用TCP协议进行通信的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序。两者的功能和编写方法不大一样。服务器端与客户端的交互过程如图所示:
在这里插入图片描述

1. InetAddress类

java.net包中的InetAddress类是与IP地址相关的类,利用该类可以获取IP地址、主机地址等信息。InetAddress类的常用方法如下表所示:

方法返回值说明
getByName(String host)InetAddress获取与Host相对应的InetAddress对象
getHostAddress()String获取InetAddress对象所包含的IP地址
getHostName()String获取此IP地址的主机名
getLocalHost()InetAddress返回本地主机的InetAddress对象

代码示例如下:

import java.net.*;

public class Address{
	public static void main(String[] args){
		InetAddress ip;
		try{
			ip = InetAddress.getLocalHost();
			String localname = ip.getHostName();
			String localip = ip.getHostAddress();
			System.out.println("本机名:" + localname);
			System.out.println("本机IP地址:" + localip);
		}catch(UnknownHostException e){
			e.printStackTrace();
		}
	}
}

2. ServerSocket类

java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是等待来自网络上的”请求“,它可通过指定的端口来等待连接的套接字。服务器套接字一次可以与一个套接字连接。如果多台客户机同时提出连接请求,服务器套接字会将请求连接的客户机存入队列中,然后从中取出一个套接字,与服务器新建的套接字连接起来。若请求连接数大于最大容纳数,则多出的连接请求被拒绝。队列的默认大小是50。

ServerSocket类的构造方法有如下几种:

  • ServerSocket():创建非绑定服务器套接字。
  • ServerSocket(int port):创建绑定到特定端口的服务器套接字。
  • ServerSocket(int port, int backlog):利用指定的backlog创建服务器套接字,并将其绑定到指定的本地端口号上
  • ServerSocket(int port, int backlog, InetAddress bindAddress):使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。这种情况适用于计算机上有多块网卡和多个IP地址的情况,用户可以明确规定ServerSocket在哪块网卡或哪个IP地址上等待客户的连接请求。

ServerSocket类常用的方法如下表所示:

方法返回值说明
accept()Socket等待客户机的连接。若连接,则创建一个套接字
isBound()boolean判断ServerSocket的绑定状态
getInetAddressInetAddress返回此服务器套接字的本地地址
isClosed()boolean返回服务器套接字的关闭状态
close()void关闭服务器套接字
bind(SocketAddress endpointvoid将ServerSocket绑定到特定地址(IP地址和端口号)
getInetAddressint返回服务器套接字等待的端口号

调用ServerSocket类的accept()方法,会返回一个和客户端Socket对象相连接的Socket对象。服务器端的Socket对象使用getOutputStream()方法获得的输出流,将指向客户端Socket对象使用getInputStream()方法获得的那个输出流。也就是说,当服务器向输出流写入信息时,客户端通过相应的输入流就能读取,反之亦然。

accept()方法会阻滞线程的继续执行,直到接收到客户的呼叫。如果没有客户呼叫服务器,那么System.out.println(“连接中”)语句将不会执行。

yu = server.accept();
System.out.println("连接中")

3. TCP网络程序

明白了TCP程序工作的过程,就可以编写TCP服务器程序了。在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单向通信。客户机套接字和服务器套接字连接成功后,客户机通过输出流发送数据,服务器则通过输入流接收数据。下面是简单的单向通信的实例。

TCP服务器程序:

import java.io.*;
import java.net.*;

public class MyTcp{
	private BufferedReader reader;
	private ServerSocket server;
	private Socket socket;
	void getserver(){
		try{
			server = new ServerSocket(8998);
			System.out.println("服务器套接字已经创建成功")
			while(true){
				System.out.println("等待客户机的连接");
				socket = server.accept();
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				getClientMessage();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getClientMessage(){
		try{
			while(true){
				System.out.println("客户机:"+reader.readLine();)
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			if(reader != null){
				reader.close()
			}
			if(reader != null){
				socket.close()
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	public static void main(String[] args){
		MyTcp tcp = new MyTcp();
		tcp.getserver();
	}
}

客户端程序:

package com.lzw;

public class MyClien extends JFrame{
	private PrintWriter writer;
	Socket socket;
	private JTextArea ta = new JTextArea();
	private JTextField tf = new JTextField();
	Container cc;
	
	public MyClien(String title){
		super(title); //调用父类的构造方法
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		cc = this.getContentPane();
		final JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBorder(new BevelBorder(BevelBorder.RAISED));
		getContentPane().add(scrollPane, BorderLayout.CENTER);
		scrollPane.setViewportView(ta);
		cc.add(tf,"South"); //将文本框放在窗体的下部
		tf.addActionListener(new ActionLisener(){
			//绑定事件
			public void actionPerformed(ActionEvent e){
				writer.println(tf.getText()); //将文本框中的信息写入流
				ta.append(tf.getText() + '\n'); //将文本框中的信息显示在文本域
				ta.setSelectionEnd(ta.getText().length());
				tf.setText(""); //将文本框清空
			}
		});
	}
	private void connect(){
		ta.append("尝试连接\n");
		try{
			socket = new Socket("127.0.0.1", 8998);
			writer = new PrintWriter(socket.getOutputStream(),true);
			ta.append("完成连接\n")
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	public static void main(String[] args){
		MyClien = new MyClien("向服务器送数据");
		clien.setSize(200,200); //设置窗体大小
		clien.setVisible(true); //将窗体显示
		clien.connect(); //调用连接方法
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/12477.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用 Kafka + DolphinDB 实时计算K线

Kafka 是一个高吞吐量的分布式消息中间件,可用于海量消息的发布和订阅。 当面对大量的数据写入时,以消息中间件接收数据,然后再批量写入到时序数据库中,这样可以将消息中间件的高并发能力和时序数据库的高吞吐量联合起来&#xf…

关于报表打印

1 分页策略 分页与打印时密切相关的,皕杰报表提供了四种分页策略,即按纸张大小分页、按数据行数分页、按数据列数分页、用户自定义分页和不分页。分页由2个因素来控制,一个每个页面的大小,另外一个是分页顺序(打印顺序…

如何将抓取下来的unicode字符串转换为中文

如果抓取的数据是json数据,那么直接将抓取的数据用json格式输出出来就行了。如下: response requests.get(url, headersheaders).json()那么大家遇到如下的unicode字符串的是如何解决的呢?如下图所示: 相信大家遇到这种一定会抓狂吧&#…

一种改进Harris算子的角点特征检测研究-含Matlab代码

⭕⭕⭕⭕ 目 录 ⭕⭕⭕⭕✅ 一、引言✅二、Harris角点检测算法✅三、角点检测实验验证✅四、参考文献✅五、Matlab代码获取✅ 一、引言 将图像中灰度变化剧烈或者在图像边界上曲率变化较大的点称为角点。角点检测对于工件图像的特征点定位有着重要作用,在进行工件的…

MySQL高级学习笔记(一)

文章目录MySQL高级学习笔记(一)1.索引1.1索引概述1.2索引优势劣势1.3索引结构1.3.1BTREE 结构1.3.2BTREE 结构1.3.3MySQL中的BTree1.4索引分类1.5索引语法1.5.1 创建索引1.5.2 查看索引1.5.3 删除索引1.5.4 ALTER命令1.6 索引设计原则2.视图概述2.1创建或者修改视图2.2查看视图…

【python3】5.正则表达式

本学习内容总结于莫烦python:5.正则表达式 https://mofanpy.com/tutorials/python-basic/interactive-python/regex5.正则表达式 本章较为重要,单独拿出来成章了 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 …

【数据结构】栈和队列的实现(C语言)

前言 栈和队列都是重要的线性结构,即在使用层面上收到限制而发挥特殊作用的线性表。掌握这两种结构在不同情景下亦会发挥重要作用。 栈 定义 栈保持着后进先出的原则,正因如此在插入数据的时候要求只能从一段插入,称为栈顶;相反另…

Arduino与Proteus仿真实例-电子相册仿真

电子相册仿真 本次实例将仿真如何从SD卡读取BMP格式图像并在ILI9341驱动器的LCD显示屏上显示。 1、仿真电路原理图 在仿真电路原理图中,SD卡通过SPI方式连接,ILI9341 LCD显示屏也是通过SPI方式连接。SD卡的CS引脚连接Arduino Mega2560的SS引脚(Pin10),显示屏的CS引脚连接…

竞赛——【蓝桥杯】2022年11月第十四届蓝桥杯模拟赛第一期Java

1、二进制位数 问题描述 十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数。 十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数。 请问十进制整数 2022 在二进制中是几位数? 答案…

数据管理技术的发展经历了哪三个阶段

数据管理技术是指对数据进行分类、组织、编码、查询和维护,它是数据处理的中心问题; 随着计算机技术的不断发展,在应用需求的推动下,在计算机硬件、软件发展的基础上数据管理技术经历了人工管理、文件管理、数据库管理3个阶段。每…

CircRNA+代谢组如何冲击22分高分文章?

发表期刊:Cell Metabolism 影响因子:22.415 发表时间:2019年5月30日 合作单位:中国科学技术大学 Biotree协助客户中国科学技术大学吴缅教授和安徽医科大学胡汪来教授及其研究团队在国际顶尖期刊《Cell Metabolism》上发表名为…

跑通yolox-s官方源码(可与yolov5s做对比试验)

目录(一)一些参考链接(二)YOLOX训练自己的数据集,修改相应代码0. 自己的数据集文件夹排布1. 修改类别标签和数量1.1 修改类别标签 yolox/data/datasets/voc_classes.py1.2 修改类别数量 exps/example/yolox_voc/yolox_…

Quartus 实例应用(2)——创建设计工程

Quartus II 简易教程一、概念回顾二、创建设计工程2.1 创建工程2.2 新建HDL文件三、编译工程四、下载一、概念回顾 什么是综合?什么是设计? 答:综合就是编译,设计就是布局布线。 二、创建设计工程 2.1 创建工程 打开Quartus I…

用vuex对token/refresh_token 进行管理以及处理token过期问题

这里介绍对token的处理 问题1:token数据或者其他数据,存在vuex仓库中,刷新会丢失状态 。 问题2:数据只存在本地,数据变化了,相关的视图并不会更新。 Vuex 容器中的数据只是为了方便在其他任何地方能方便的获…

【EC200U】 基站定位

EC200U 基站定位什么是基站基站定位cellLocator - 基站定位调用获取坐标token 秘钥申请运行测试我们之前玩了GPS了【EC200U】GPS定位 GPS 精度高,但比较费电,首次搜索卫星定位时间比较长,当卫星信号覆盖不好,比如室内,…

gdb-dashboard的简单使用

问题描述 众所周知,随着IDE的普及,越来越多的人不习惯命令行调试,但是Linux开发又绕不开GDB,所以有大佬开发了程序用来显示常见的一些调试参数,gdb-dashboard是比较热门的程序之一。附链接。 使用参考 神仙GDB调试工…

Golang入门笔记(7)—— 函数 func

函数是什么? 函数:为完成某一功能的程序的语句指令的集合。 感觉重头戏逐渐到来了,让我们好好的,认真对待它吧!为什么要使用函数? 为了提高代码的复用,减少代码的冗余,提高代码维护性…

前端框架 React 学习总结

目录 一、React在HTML里的运用 二、React框架的常用操作 1、JSX基础语法规则 2、state数据的使用 3、生命周期 4、数据的双向绑定与Ref 5、PropTypes验证规则 6、React里的插槽 7、错误边界 8、直接操作refs元素 9、高阶组件的运用案例 10、性能优化 11、Hook生命…

Linux中安装mysql8

一、下载MySQL到 /usr/local/src 1、打开官网下载界面 MySQL :: Download MySQL Community Server (Archived Versions) 2、选择某个版本的下载地址 以https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.30-linux-glibc2.12-x86_64.tar.xz这个地址作为例子 …

Kubernetes 系统化学习之 持久存储篇(五)

1. ConfigMap ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。ConfigMap 的主要作用就是为了让镜像和配置文件解耦,以便实现镜像的可移植性和可复用性…