温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
  • 忘记密码?
登录注册×
获取短信验证码
其他方式登录
点击 登录注册 即表示同意 《亿速云用户服务条款》
  • 服务器
  • 数据库
  • 开发技术
  • 网络安全
  • 互联网科技
登 录 注册有礼
最新更新 网站标签 地图导航
产品
  • 首页 > 
  • 教程 > 
  • 开发技术 > 
  • 用TCP协议实现客户端与服务器通信的方法

用TCP协议实现客户端与服务器通信的方法

发布时间:2020-07-07 14:16:06 来源:亿速云 阅读:255 作者:清晨 栏目: 开发技术

小编给大家分享一下用TCP协议实现客户端与 服务器通信的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!

进行TCP协议网络程序的编写,关键在于ServerSocket套接字的熟练使用,TCP通信中所有的信息传输都是依托ServerSocket类的输入输出流进行的。

上一篇博客和大家分享了在网络编程中要注意的基础知识,关于IP、TCP、UDP以及端口和套接字的一些概念,想了解的小伙伴可以看我的这篇文章“盘点那些进行网络编程必须要知道的基础知识”,那么今天大灰狼就来和大家分享一下如何使用TCP/IP进行网络程序的开发。

TCP协议概念

先来了解一下TCP协议的基本概念。

我们知道TCP是可靠而非安全的网络协议。它可以保证数据在从一端送至另一端的时候可以准确的送达,并且抵达的数据的排列顺序和送出时的顺序是相同的。因此在进行TCP协议通信的时候,我们首先应该保证客户端和服务器之间的连接通畅。

而TCP协议程序的编写,仍然是依靠套接字Socket类来实现的,并且利用TCP协议进行通信的两个程序之间是有主次之分的,即一个是服务器的程序,另一个是客户端的程序。因此两者的功能和编写上也略有不同。如下图是服务器与客户端之间进行通信的示意图:

用TCP协议实现客户端与服务器通信的方法

以上就是在TCP协议中客户端与服务器建立连接的过程示意图。而在这其中起到关键作用的就是服务器端套接字ServerSocket和客户端套接字Socket。通过这两个套接字来建立服务器和客户端,从而利用其中的函数进行数据的通信。

在ServerSocket类中有很多需要注意的地方,接下来大灰狼和大家分享一下ServerSocket类的具体用法: 

ServerSocket类

ServerSocket类存在于Java.net包中,表示服务器端的套接字,在使用时需要首先导入这个类,我们也知道ServerSocket类的主要功能就是通过指定的端口等待来自于网络中客户端的请求并且进行连接。

值得注意的是:服务器套接字一次只能与一个客户端套接字进行连接,因此如果存在多台客户端同时发送连接请求,则服务器套接字就会将请求的客户端存放到队列中去,然后从中取出一个套接字与服务器建立的套接字进行连接,但是服务器端能够容纳的客户端套接字也不是无限的,当请求连接的数量大于最大容纳量时,那么多出来的请求就会被拒接,一般来说队列的默认大小是50。

  • ServerSocket类的构造方法通常会抛出IOException异常,具体有以下几种形式:
  • ServerSocket():创建非绑定服务器套接字
  • ServerSocket(inr port):创建绑定到特定端口的服务器套接字
  • ServerSocket(int port, int backlog):利用指定的backlog创建服务器套接字,并将其绑定到指定的服务器端口上
  • ServerSocket(int port, int backlog, InetAddress bindAddress):使用指定的端口,侦听backlog和要绑定到本地的IP地址创建服务器。这种情况适用于计算机上有多个网卡和多个IP地址的情况,用户可以明确的规定ServerSocket在哪块网卡或哪个IP地址上等待用户的连接请求。

以下是ServerSocket类中一些常用的方法:

ServerSocket类中常用的方法

方法

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

了解了ServerSocket类的基本方法之后,就是如何进行客户端和服务器进行连接的问题了。

在服务器端我们可以调用ServerSocket类的accpet()方法与请求连接的客户机建立连接,这时会返回一个和客户端相连接的Socket对象,这个时候其实已经连接成功了,使用getInetAddress()方法就可以获取到进行请求的客户机的IP地址。

对于如何进行客户端和服务器端数据的通信,就要用到数据的输入流和输出流了,服务器端的Socket对象使用getOutputStream()方法获取到的输出流,将指向客户端的Socket对象使用getInputStream()方法获取到的输入流。由此就实现在服务器向客户端发送数据的一个过程,同样的道理,客户端端的Socket对象使用getOutputStream()方法获取到的输出流,将指向服务器端的Socket对象使用getInputStream()方法获取到的输入流。从而实现由客户端向服务器发送数据的过程。

注意:accpet()方法会阻塞线程的继续执行,如果在对应的接口没有收到客户端的呼叫,则程序会停留在此处,直到获取到客户端的呼叫才会继续向下执行,但是如果服务器没有收到来自客户端的呼叫请求,并且accpet()方法没有发生阻塞,那么通常情况下就是程序出了问题,一般来说可能是使用了一个已经被其他程序占用了的端口号,导致ServerSocket没有绑定成功!遇到这种情况可以尝试更换新的端口号。

了解了TCP协议的通信过程,接下来就是进行TCP通信程序的书写啦!

在网络通信中,如果只要求客户机向服务器发送信息,不要求服务器向客户端反馈信息的行为称为“单向通信”,要求客户机和服务器双方互相通信的过程称为“双向通信”,双向通信只不过是比单向通信多了一个服务器向客户端发送消息的过程,

接下来分别是服务器端和客户端程序的编写:

 服务器端程序

package server_1;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
 
public class MyTcp {
 
	private ServerSocket server;	//设置服务器套接字
	private Socket client;		//设置客户端套接字
	
	//连接客户端函数
	void getServer()
	{
		try {
			server = new ServerSocket(1100);	//建立服务器 端口为1100
			System.out.println("服务器建立成功!正在等待连接......");
			client = server.accept();	//调用服务器函数对客户端进行连接			
			System.out.println("客户端连接成功!ip为:" + client.getInetAddress());	//返回客户端IP		
			getClientMessage();		//调用信息传输和接收函数
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	
	void getClientMessage()
	{
		try {
			while (true) {
				InputStream is = client.getInputStream();	//获取到客户端的输入流
				byte[] b = new byte[1024];	//定义字节数组
				int len = is.read(b);	//由于信息的传输是以二进制的形式,所以要以二进制的形式进行数据的读取
				String data = new String(b, 0,len);
				System.out.println("客户端发来消息:" + data);
				
				//定义发送给客户端的输出流
				OutputStream put = client.getOutputStream();
				String putText = "我已经收到!欢迎你!";
				put.write(putText.getBytes());	//将输出流信息以二进制的形式进行写入
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		try {
			//判断客户端字节流不是空,则关闭客户端
			if (server != null) {
				server.close();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MyTcp myTcp = new MyTcp();	//调用该类生成对象
		myTcp.getServer();	//调用方法
	}
 
}

客户端程序

package client_1;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
 
public class MyClient {
	private Socket client;	//定义客户端套接字
	
	//建立客户端函数
	void getClient()
	{
		try {
			client = new Socket("127.0.0.1", 1100);	//建立客户端,使用的IP为127.0.0.1,端口和服务器一样为1100
			System.out.println("客户端建立成功!");
			
			setClientMessage();		//调用客户端信息写入函数
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	//定义客户端信息写入函数
	void setClientMessage()
	{
		try {		
			OutputStream pt = client.getOutputStream();		//建立客户端信息输出流
			String printText = "服务器你好!我是客户端!";	
			pt.write(printText.getBytes());		//以二进制的形式将信息进行输出
			
			InputStream input = client.getInputStream();	//建立客户端信息输入流
			byte [] b = new byte[1024];		//定义字节数组
			int len = input.read(b);	//读取接收的二进制信息流
			String data = new String(b, 0,len);
			System.out.println("收到服务器消息:" + data);
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
		try {
			//如果客户端信息流不为空,则说明客户端已经建立连接,关闭客户端
			if (client != null) {
				client.close();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//生成客户端类对象
		MyClient myClient = new MyClient();
		myClient.getClient();
	}
 
}

同时要注意:在客户端和服务器搭建成功之后,应该先打开服务器等待连接,再打开客户端进行连接,同样在进行关闭时,应该先关闭客户端,再关闭服务器。

以上面程序为例:

打开服务器等待客户端连接

用TCP协议实现客户端与服务器通信的方法

打开客户端与服务器连接成功,并且实现双向通信:

用TCP协议实现客户端与服务器通信的方法

注意:当一台机器上安装了多个网络应用程序时,很可能指定的端口已经被占用,甚至还可能遇到之前运行很好的程序突然卡住的情况,这种情况很可能是端口被别的程序占用了,这时可以运行netstat-help来活的帮助,可以使用命令netstat-an来查看该程序所使用的端口。

看完了这篇文章,相信你对用TCP协议实现客户端与服务器通信的方法有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节
推荐阅读:
  1. TCP与UDP协议
  2. 基于TCP协议的进程间通信

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java 客户端 服务器
  • 上一篇新闻:
    如何使用linux的apt-get命令安装软件
  • 下一篇新闻:
    UEditor 添加在线管理图片删除功能

猜你喜欢

  • 电脑桌面文件打不开的原因以及解决方法
  • 电脑怎么查看ip地址和路由器网关
  • 被误删(永久删除、彻底删除)的文件如何找回
  • 电脑如何打开软键盘
  • 电脑怎么打角度符号
  • 云计算是什么意思
  • 查看自己的ip地址
  • 电脑C盘可以删除的文件用那些
  • 电脑上无法卸载程序如何解决
  • 虚拟主机管理系统怎么打开
最新资讯
  • 如何在Elixir中使用广播通知系统组件
  • 如何在Elixir中实现基于角色的访问控制
  • Elixir与其他函数式编程语言相比有哪些独特的特性
  • 如何在Elixir中实现乐观锁定机制
  • Elixir应用的内存优化技巧有哪些
  • 在Elixir中如何结合使用OTP和WebSockets构建实时应用
  • Elixir的宏系统有哪些高级用法
  • 如何在Elixir中优化长轮询
  • Elixir中的错误日志管理最佳实践是什么
  • 如何在Elixir中处理大规模并发连接
相关推荐
  • TCP-IP协议详解(8) TCP协议与流通信
  • epoll实现TCP通信
  • python中基于tcp协议通信的示例分析
  • java Tcp通信客户端与服务器端实例
  • 详解Android 基于TCP和UDP协议的Socket通信
  • Tcp协议怎么实现HTTP服务器
  • 基于TCP协议连接远程服务器通信的方法是什么
  • Java后端开发中TCP通信传输协议怎么用
  • Qt中TCP协议通信怎么使用
  • 基于Qt的TCP怎么实现通信

相关标签

java教程 -java javafx与jfoenix教程 javaee java编程思想 javaserver java 链表 java源文件 java架构 java基础 java nio javafx java异常 java 高并发 javase java对象 java运算符 javacv java虚拟主机 javax.servlet
AI

深圳SEO优化公司坪山网站推广系统宝安百度seo光明关键词排名南联网页制作横岗网站推广方案南山百度爱采购坪地网页制作坪山网站推广方案大芬百度关键词包年推广松岗网站推广工具惠州网站优化按天收费沙井网站制作吉祥网站改版塘坑如何制作网站广州外贸网站建设广州网站推广系统宝安至尊标王南澳建设网站东莞营销型网站建设布吉网页设计坪地推广网站东莞关键词排名包年推广爱联网站关键词优化南山营销型网站建设松岗网站改版塘坑设计公司网站深圳关键词按天计费同乐百度标王观澜百度竞价包年推广坂田SEO按天收费歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化