基于tcp和udp的socket实现
2019独角兽企业重金招聘Python工程师标准>>>
本文介绍如何用Java实现Socket编程。首先介绍Java针对Socket编程提供的类,以及它们之间的关系。然后分别针对TCP和UDP两种传输层协议实现Socket编程。
1 Java中的Socket编程接口介绍
Java为Socket编程封装了几个重要的类。
1.1 Socket类
Socket类实现了一个客户端socket,作为两台机器通信的终端,默认采用的传输层协议为TCP,是一个可靠传输的协议。Socket类除了构造函数返回一个socket外,还提供了connect, getOutputStream, getInputStream和close方法。connect方法用于请求一个socket连接,getOutputStream用于获得写socket的输出流,getInputStream用于获得读socket的输入流,close方法用于关闭一个流。
1.2 DatagramSocket类
DatagramSocket类实现了一个发送和接收数据报的socket,传输层协议使用UDP,不能保证数据报的可靠传输。DataGramSocket主要有send, receive和close三个方法。send用于发送一个数据报,Java提供了DatagramPacket对象用来表达一个数据报。receive用于接收一个数据报,调用该方法后,一直阻塞接收到直到数据报或者超时。close是关闭一个socket。
1.3 ServerSocket类
ServerSocket类实现了一个服务器socket,一个服务器socket等待客户端网络请求,然后基于这些请求执行操作,并返回给请求者一个结果。ServerSocket提供了bind、accept和close三个方法。bind方法为ServerSocket绑定一个IP地址和端口,并开始监听该端口。accept方法为ServerSocket接受请求并返回一个Socket对象,accept方法调用后,将一直阻塞直到有请求到达。close方法关闭一个ServerSocket对象。
1.4 SocketAddress
SocketAddress提供了一个socket地址,不关心传输层协议。这是一个虚类,由子类来具体实现功能、绑定传输协议。它提供了一个不可变的对象,被socket用来绑定、连接或者返回数值。
1.5 InetSocketAddress
InetSocketAddress实现了IP地址的SocketAddress,也就是有IP地址和端口号表达Socket地址。如果不制定具体的IP地址和端口号,那么IP地址默认为本机地址,端口号随机选择一个。
1.6. DatagramPacket
DatagramSocket是面向数据报socket通信的一个可选通道。数据报通道不是对网络数据报socket通信的完全抽象。socket通信的控制由DatagramSocket对象实现。DatagramPacket需要与DatagramSocket配合使用才能完成基于数据报的socket通信。
2. 基于TCP的Socket编程
上面描述了Java对Socket编程提供的接口,本节介绍如何实现一个基于TCP连接的Socket通信。
下面例子是Server端等待从Client端接收一条消息,然后再给客户端发送一个消息。
服务器端首先实例化ServerSocket对象,然后为其绑定一个本机地址,并开始监听。一直阻塞状态下等待客户端请求,当获得客户端连接请求后,返回一个socket对象。然后用这个socket接收一条消息,并发送一条消息。代码如下:
package server.socket.java;import java.io.IOException; import java.io.PrintWriter; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress;public class SocketTcp {static private String TAG = "SocketTcp: ";public static void main(String[] args){try {ServerSocket server = new ServerSocket();SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 10001);server.bind(address);System.out.println("==waiting for being connected...");Socket client = server.accept();System.out.println("==connected with " + client.getRemoteSocketAddress() );PrintWriter socketOut = new PrintWriter(client.getOutputStream());System.out.println("==waiting message from client...");byte buf[] = new byte[1024];if ( client.getInputStream().read(buf) > 0 ) {System.out.println("Receive Message: " + new String(buf));}System.out.println("==sending message to client...");String sendStr = "This is the message for client.";socketOut.write(sendStr);socketOut.flush();socketOut.close();client.close();server.close();} catch (IOException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();}} }
客户端首先实例化一个socket对象,用这个对象连接服务器端。连接成功后,发送一条消息,然后等待接收一条消息。代码如下:
package client.socket.java;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.Socket; import java.net.SocketAddress;public class SocketTcp {static private String TAG = "SocketTcp: ";public static void main(String[] args){try {final Socket socket = new Socket();SocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 10001);System.out.println("==connecting to server ...");socket.connect(address);PrintWriter socketOut = new PrintWriter(socket.getOutputStream());BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()) );String sendStr = "This is the message for server.";System.out.println("==sending message to server ...");socketOut.write(sendStr);socketOut.flush();System.out.println("==waiting message from server ...");String receiveStr = socketIn.readLine();System.out.println("Receive Message: " + receiveStr);socketOut.close();socketIn.close();socket.close();} catch (IOException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();} finally {}} }
服务器端运行结果:
==waiting for being connected... ==connected with /172.26.176.69:53912 ==waiting message from client... Receive Message: This is the message for server.
客户端运行结果:
==connecting to server ... ==sending message to server ... ==waiting message from server ... Receive Message: This is the message for client.
3 基于UDP的Socket编程示例
基于UDP的Socket编程与基于TCP的socket编程稍有不同,socket server和client都用DatagramSocket实现。
下面例子是Server端等待从Client端接收一条消息,然后再给客户端发送一个消息。
服务器端首先实例化DatagramSocket对象,然后为其绑定一个本机地址,并开始监听。一直阻塞状态下等待从客户端接收数据报。然后从数据报中获取数据报的源地址,然后用这个源地址作为目的地址打包一个数据报,然后发送出去。代码如下:
package server.socket.java;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.SocketException; import java.net.UnknownHostException;public class SocketUdp {final private static String TAG = "SocketUdp: ";public static void main(String args[]) {DatagramSocket socket = null;DatagramPacket datapacket = null;InetSocketAddress address = null;try {address = new InetSocketAddress(InetAddress.getLocalHost(), 7778);socket = new DatagramSocket(address);// socket.bind(address);byte buf[] = new byte[1024];datapacket = new DatagramPacket(buf, buf.length);System.out.println("==block for receive messages...");socket.receive(datapacket);buf = datapacket.getData();InetAddress addr = datapacket.getAddress();int port = datapacket.getPort();System.out.println("Message Content: " + new String(buf) );System.out.println("Receive From " + addr + ":" + port);SocketAddress toAddress = datapacket.getSocketAddress();String sendStr = "I'm Server, this is the message for client.";buf = sendStr.getBytes();datapacket = new DatagramPacket(buf, buf.length);datapacket.setSocketAddress(toAddress);socket.send(datapacket);System.out.println("==message sended");} catch (UnknownHostException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();} catch (SocketException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();} catch (IOException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();}}}
客户端首先实例化一个DatagramSocket对象。利用服务器地址和端口号作为目的地址打包一个数据报,并发送。然后等待从服务器回复的数据报。代码如下:
package client.socket.java;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketException; import java.net.UnknownHostException;public class SocketUdp {final private static String TAG = "SocketUdp: ";public static void main(String args[]) {try {DatagramSocket getSocket = new DatagramSocket();DatagramPacket datapacket = null;InetSocketAddress toAddress = new InetSocketAddress(InetAddress.getLocalHost(), 7778);String sendStr = "I'm client, this is the message for server.";byte buf[] = sendStr.getBytes();datapacket = new DatagramPacket(buf, buf.length);datapacket.setSocketAddress(toAddress);getSocket.send(datapacket);System.out.println("==message sended");System.out.println("==block for receive messages...");getSocket.receive(datapacket);buf = datapacket.getData();System.out.println("Message Content: " + new String(buf));} catch (SocketException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();} catch (UnknownHostException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();} catch (IOException e) {System.out.println(TAG + e.getMessage());e.printStackTrace();}} }
服务器端运行结果:
==block for receive messages... Message Content: I'm client, this is the message for server.
客户端运行结果:
==message sended ==block for receive messages... Message Content: I'm Server, this is the message for client.
分类: 网络编程,Java学习笔记
好文要顶 关注我 收藏该文
洪雁君
关注 - 7
粉丝 - 3
+加关注
0
0
« 上一篇:传输层中的TCP和UDP浅析
» 下一篇:长连接与短连接
posted on 2013-09-02 00:56 洪雁君 阅读(4109) 评论(0) 编辑 收藏
刷新评论刷新页面返回顶部
注册用户登录后才能发表评论,请 登录 或 注册,访问网站首页。
【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
【活动】阿里云双11活动开始预热 云服务器限时2折起
【调查】有奖调研即刻参与,你竟然是酱紫程序猿!
【推荐】Vue.js 2.x 快速入门,大量高效实战示例
最新IT新闻:
· 《周鸿祎自传》书摘:首谈私有化,我从没想过退出
· 一个老外的自述:“在中国手机就是我的生命”
· PayPal CEO:未来5年内 金融科技变化将远超过去30年
· 快递员回应"月薪过万":送1件提成1元 双11可挣万元
· 微软收购动态图片应用程序Swng 团队加入Skype部门
» 更多新闻...
最新知识库文章:
· 关于编程,你的练习是不是有效的?
· 改善程序员生活质量的 3+10 习惯
· NASA的10条代码编写原则
· 为什么你参加了那么多培训,却依然表现平平?
· 写给初学前端工程师的一封信
» 更多知识库文章...
Powered by:
博客园
Copyright © 洪雁君
|
||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|---|---|---|---|---|---|
29 | 30 | 31 | 1 | 2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
导航
- 博客园
- 首页
- 新随笔
- 联系
- 订阅
- 管理
统计
- 随笔 - 27
- 文章 - 1
- 评论 - 1
- 引用 - 0
公告
昵称:洪雁君
园龄:7年6个月
粉丝:3
关注:7
+加关注
搜索
常用链接
- 我的随笔
- 我的评论
- 我的参与
- 最新评论
- 我的标签
我的标签
- Linux学习笔记(3)
- JavaScript(2)
- OTT(1)
- XMLHttpRequest(1)
- 微信(1)
随笔分类
- Java学习笔记(5)
- Linux学习笔记(6)
- NodeJS(1)
- python学习笔记(1)
- 调研报告(2)
- 科技时评(1)
- 网络编程(3)
随笔档案
- 2014年6月 (1)
- 2013年11月 (6)
- 2013年10月 (2)
- 2013年9月 (7)
- 2013年8月 (5)
- 2013年7月 (2)
- 2013年6月 (1)
- 2013年4月 (1)
- 2013年1月 (2)
相册
- blog配图(4)
最新评论
- 1. Re:关于运营商向微信收费的所感
- 赞同楼主的观点!
- --刘江北
阅读排行榜
- 1. FFserver服务器实现WebM格式视频直播(4234)
- 2. 基于TCP和UDP的Socket实现(JAVA)(4109)
- 3. JavaScript中XMLHttpRequest实现跨域访问(3722)
- 4. Ubuntu通过apt-get安装Oracle JDK(1374)
- 5. 云计算面试题集锦(1261)
推荐排行榜
- 1. FFserver服务器实现WebM格式视频直播(1)
转载于:https://my.oschina.net/u/3644171/blog/1563945
基于tcp和udp的socket实现相关推荐
- 基于TCP和UDP的socket
为什么学习socket 你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引入,文件引入import等等,我可以在程序中获取到另一个文件的 ...
- C++基于TCP和UDP的socket通信
TCP和UDP属于传输层协议.其中TCP提供IP环境下的数据可靠传输,它事先为要发送的数据开辟好连接通道(三次握手),然后再进行数据发送:而UDP则不为IP提供可靠性,一般用于实时的视频流传输,像rt ...
- TCP与UDP在socket编程中的区别
TCP与UDP在socket编程中的区别 一.TCP与UDP的区别 基于连接与无连接 对系统资源的要求(TCP较多,UDP少) UDP程序结构较简单 流模式与数据报模式 TCP保证数据正确性,UDP可 ...
- 实验一 基于TCP和UDP的客户端和服务器端
基于TCP和UDP的客户端和服务器端 一. 实验要求 二.实验目的 三. 实验环境 四. 实验内容 五. 实验原代码 六. 实验结论 七. 实验错误及改正 八. 总结 一. 实验要求 (1)分别编写基 ...
- 超硬核!!!一篇文章搞定TCP、UDP、Socket、HTTP(详细网络编程内容+现实解释三次握手四次挥手+代码示例)【网络编程 1】
TCP.UDP.Socket 一天面试的经验: 什么是网络编程 网络编程中两个主要的问题 网络协议是什么 为什么要对网络协议分层 计算机网络体系结构 1 TCP / UDP 1.1 什么是TCP/IP ...
- QT示例:基于TCP 点对多Socket通讯(server,clients)
QT示例:基于TCP 点对多通讯(server,clients) 一.服务器server 二.客户端Client 下载:基于TCP 点对多Socket通讯 一.服务器server 因为对于客户端来说, ...
- tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手
socket编程 网络字节序 定义 为什么网络数据需要转换为网络字节序? Udp协议 Tcp协议 Udp的socket编程 编程流程 接口 创建套接字 绑定地址信息 发送 接收 关闭 主机字节序转换成 ...
- 群聊系统项目(基于TCP、UDP实现)
最近学习了网络编程后, 写了一个基于TCP.UDP协议的群聊系统. 技术栈 1.TCP.UDP通信 2.生产.消费模型, 支持并发 3.自定义协议封装数据 & json ...
- udp协议没有粘包问题、基于socketserver实现并发的socket(基于tcp、udp协议)、基于udp协议的套接字、操作系统原理以及进程知识
基于udp协议的套接字通信服务端 from socket import *server=socket(AF_INET,SOCK_DGRAM) #数据报协议->udp server.bind((' ...
最新文章
- (三)spark集群DHCP IP变化后的处理
- 【迁移学习(Transfer L)全面指南】Domain-Adversarial Training:基于对抗的迁移学习方法
- Slackware网卡配置文件和配置工具
- 【跨平台网络抓包神器のtcpdump】ubuntu下编译tcpdump开源抓包工具
- matlab fspeical,matlab的special函数用法
- VTK:vtkActor2D用法实战
- 工控随笔_04_西门子_解决Step 7软件因授权问题不能打开的方式和方法
- vue --- 使用vue-router获取带参数的路由
- finalize方法注意事项(防止子类没有显示调用super.finalize())
- 何小鹏“维权”事后谈造车:心很累 曾购上千瓶白酒缓解压力
- CentOS7安装Nmon(linux性能监控工具)
- MIUI12.5安装ca证书提示失败
- Echarts官网Json获取方式
- 计算机实验室建设论证报告,计算机实验室实习报告-报告.doc
- C# 实现数字转汉字大写
- Tinymce组件cdn失效解决办法
- 主谓一致 | 谓语动词单复数使用讲解
- wps如何用循环函数_WPS版Excel中怎样使用函数进行运算
- 计算用户浏览时长(微信浏览器)
- v-viewer 插件图片点击放大预览的几种使用方法
热门文章
- Windows Caffe中MNIST数据格式转换实现
- python多功能电子钟_python gui - PyQt4 精彩实例分析之电子钟
- python selenium unittest_python+selenium+unittest——ui自动化的轻量级选择
- SpringBoot复习:3(@Conditional)
- JavaWeb项目第三次总结_成绩查询的实现
- React 父组件给子组件传值,子组件接收
- Bootstrap select 多选并获取选中的值
- 【微信小程序】侧滑栏,手动侧滑出个人中心(完整代码附效果图)
- 【iOS】Mapkit的使用:地图显示、定位、大头针、气泡等
- [UWP] 用 AudioGraph 来增强 UWP 的音频处理能力——AudioFrameInputNode