TCP、UDP网络通信
IP地址和端口号
端口号是用两个字节(16位的二进制数)表示的,它的取值范围是0~65535,其中,0~1023之间的端口号用于一些知名的网络服务和应用,
用户的普通应用程序需要使用1024以上的端口号,从而避免端口号被另外一个应用或服务所占用。
InetAddress
常用方法

代码演示:
public static void main(String[] args) throws UnknownHostException {
//InetAddress inet=InetAddress.getLocalHost();
//主机名+ip地址
InetAddress inet=InetAddress.getByName("DESKTOP-KCD8G34");
System.out.println(inet);
String host=inet.getHostName();
String ip=inet.getHostAddress();
System.out.println(host+"..."+ip);
}
UDP通信
DatagramPacket



DatagramSocket



UDP网络程序

代码演示:
//发送端
public class UDPSend {
public static void main(String[] args) throws IOException {
//1.打包
//明确数据
byte[] bytes="你好吗".getBytes();
//明确目的地的IP地址
InetAddress inet=InetAddress.getByName("127.0.0.1");
//装包
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,8888);
//2.创建快递公司
DatagramSocket ds=new DatagramSocket();
//3.发送
ds.send(dp);
//4.释放资源
ds.close();
} }
//接收端
public class UDPReceive {
public static void main(String[] args) throws IOException {
//明确端口号
DatagramSocket ds=new DatagramSocket(8888);
//创建接收数据的字节数组
byte[] bytes=new byte[1024];
//创建接收的数据包
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
//接收
ds.receive(dp);
//获取接收包上的数据
int length=dp.getLength();
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"+new String(bytes,0,length));
//释放资源
ds.close();
} }
TCP通信
一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。
ServerSocket


Socket


|
方法声明 |
功能描述 |
|
int getPort() |
该方法返回一个int类型对象,该对象是Socket对象与服务器端连接的端口号 |
|
InetAddress getLocalAddress() |
该方法用于获取Socket对象绑定的本地IP地址,并将IP地址封装成InetAddress类型的对象返回 |
|
void close() |
该方法用于关闭Socket连接,结束本次通信。在关闭socket之前,应将与socket相关的所有的输入/输出流全部关闭,这是因为一个良好的程序应该在执行完毕时释放所有的资源 |
|
InputStream getInputStream() |
该方法返回一个InputStream类型的输入流对象,如果该对象是由服务器端的Socket返回,就用于读取客户端发送的数据,反之,用于读取服务器端发送的数据 |
|
OutputStream getOutputStream() |
该方法返回一个OutputStream类型的输出流对象,如果该对象是由服务器端的Socket返回,就用于向客户端发送数据,反之,用于向服务器端发送数据 |
图解:

代码演示:
//发送端
public class UDPSend {
public static void main(String[] args) throws IOException {
//1.打包
//明确数据
Scanner sc=new Scanner(System.in);
//明确目的地的IP地址
InetAddress inet=InetAddress.getByName("192.168.1.171");
//2.创建快递公司
DatagramSocket ds=new DatagramSocket();
while(true){
String mes=sc.next();
byte[] bytes=mes.getBytes();
//装包
DatagramPacket dp=new DatagramPacket(bytes, bytes.length,inet,6666);
//3.发送
ds.send(dp);
}
//4.释放资源
//ds.close(); }
//接收端
public class UDPReceive {
public static void main(String[] args) throws IOException {
//明确端口号
DatagramSocket ds=new DatagramSocket(8888);
//创建接收数据的字节数组
byte[] bytes=new byte[1024];
//创建接收的数据包
while(true){
DatagramPacket dp=new DatagramPacket(bytes, bytes.length);
//接收
ds.receive(dp);
//获取接收包上的数据
int length=dp.getLength();//明确发送的字节长度
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
System.out.println("ip地址为:"+ip+"端口号为:"+port+"发送的内容为:"
+new String(bytes,0,length));
}
}
//服务器端
public class TCPServer {
public static void main(String[] args) throws IOException {
//创建服务器套接字
ServerSocket server=new ServerSocket(7777);
//调用accept方法与客户端创建链接
Socket socket=server.accept();
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//服务器给客户端回复
OutputStream out=socket.getOutputStream();
out.write("收到!over!".getBytes()); server.close();
}
//客户端
public class TCPCLient {
public static void main(String[] args) throws IOException {
//1.创建Socket对象,连接服务器
Socket socket=new Socket("127.0.0.1",7777);
//2.通过客户端套接字对象Socket对象中的获取字节输出流的方法
OutputStream out=socket.getOutputStream();
//3.将数据写向服务器
out.write("服务器你好".getBytes());
//接收服务器端的回复
InputStream in=socket.getInputStream();
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println(new String(bytes, 0, len));
//释放资源
socket.close();
}
文件上传案例

代码演示:
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(5555);
Socket socket=server.accept();
//明确数据源
InputStream in=socket.getInputStream();
//明确目的地
File file=new File("x:\\upload");
if(!file.exists()){
file.mkdirs();
}
//域名+毫秒值
String filename="oracle"+System.currentTimeMillis()+".jpg";
FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
//复制
int len=0;
byte[] bytes=new byte[1024];
while((len=in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//回复客户端
OutputStream out=socket.getOutputStream();
out.write("上传成功!".getBytes());
//释放资源
server.close();
fos.close();
}
}
public class TCPClinet {
public static void main(String[] args) throws IOException {
Socket socket=new Socket("192.168.1.171",7000);
OutputStream out=socket.getOutputStream();
//明确数据源
FileInputStream fis=new FileInputStream("x:\\test\\img1.jpg");
int len=0;
byte[] bytes=new byte[1024];
//文件复制
while((len=fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
//告诉服务器端不要在读了到末尾了
socket.shutdownOutput();
//服务器端回复
InputStream in=socket.getInputStream();
len=in.read(bytes);
System.out.println(new String(bytes, 0, len));
//释放资源
fis.close();
socket.close();
}
}
文件上传案例多线程版本

代码演示:
public class Demo {
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(6000);
while(true){
Socket socket=server.accept();
new Thread(new Upload(socket)).start();
}
}
}
public class Upload implements Runnable{
private Socket socket;
public Upload(Socket socket){
this.socket=socket;
}
public void run() {
//明确数据源
FileOutputStream fos=null;
try {
InputStream in= socket.getInputStream();
//明确目的地
File file=new File("x:\\upload");
if(!file.exists()){
file.mkdirs();
}
//域名+毫秒值
String filename="oracle"+System.currentTimeMillis()+".jpg";
fos=new FileOutputStream(file+File.separator+filename);
//复制
int len=0;
byte[] bytes=new byte[1024];
while((len=in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//回复客户端
OutputStream out=socket.getOutputStream();
out.write("上传成功!".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally{
//释放资源
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
TCP、UDP网络通信的更多相关文章
- Java中的TCP/UDP网络通信编程
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...
- Java TCP/UDP网络通信编程
本文转自:http://www.cnblogs.com/cdtarena/archive/2013/04/10/3012282.html 网络应用中基本上都是TCP(Transmission Cont ...
- UC编程之网络通信(TCP/UDP)
网络常识 OSI 7层模型(人机交互) 物理层.数据链路层.网络层.传输层.会话层.表现层.应用层 常见协议: tcp/udp/ip/ftp/http... IP地址--就是计算机在网络中的地址,是一 ...
- Java 网络通信(TCP/UDP)
1.InetAdress类 与 Socket类 >InetAdress >Socket 2.TCP/IP协议簇 客户端: 创建 Socket:根据指定服务端的 IP 地址或端口号构 ...
- 开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等
开源基于asio的网络通信框架asio2,支持TCP,UDP,HTTP,RPC,SSL,跨平台,支持可靠UDP,支持TCP自动拆包,TCP数据报模式等 C++开发网络通信程序时用asio是个不错的选择 ...
- HP-SOCKET TCP/UDP通信框架库解析
项目概述: HP-SOCKET是一套通用TCP/UDP通信框架,包括服务器.客户端.Agent组件:其目标是提供高性能.通用性.简易性.可扩展.可定制: 鉴于此,其仅实现基本的通用框架通信.数据收发功 ...
- HTTP,FTP,TCP,UDP及SOCKET
一.TCP/IP协议简析TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层:网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议传输层:TCP协议与UDP协议应用层:F ...
- SOCKET,TCP/UDP,HTTP,FTP
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- [网络] SOCKET, TCP/UDP, HTTP, FTP
(一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...
- TCP/UDP简介
TCP/UDP简介 Socket小白篇-附加TCP/UDP简介 Socket 网络通信的要素 TCP和UDP Socket的通信流程图 1.Socket 什么是Socket Socket:又称作是套接 ...
随机推荐
- 基于kafka-net实现的可以长链接的消息生产者
今天有点时间,我就来说两句.最近接触的Kafka相关的东西要多一些,其实以前也接触过,但是在项目使用中的经验不是很多.最近公司的项目里面使用了Kafka消息中间件,由于以前的人员编写的客户端的类不是很 ...
- 单元测试使用spring注解获取bean
在实际项目开发中经常会有单元测试,单元测试中经常会用类似这样的代码片段获取spring管理的bean @Test public void testSendEmail(){ MessageService ...
- C# devexpress gridcontrol 分页 控件制作
这个小小的功能实现起来还是有一点点复杂, 分页单独一个usercontrol 出来,导致查询换页 与gridcontrol页面分离, 一般通过换页事件通知girdcontrol 做出查询 查询来说有 ...
- spring读取properties的几种方式
参考链接:http://www.cnblogs.com/zxf330301/p/6184139.html
- 动态链接库DLL导出函数并导入使用
动态链接库DLL导出函数并导入使用 本文完全参考自<vs2008制作dll笔记,回带值样例>. 首先制作DLL文件,在vs2010中新建Win32控制台项目,选择DLL选项,简历头文件,源 ...
- css字符串转换为类map对象及反转
存储对象为啥是类map(即:{key:val,...}格式),因为Map对象的val为字符时,无法存储 '('.')' 左右括号,我也很无奈╮(╯▽╰)╭ 解析脚本: <!DOCTYPE htm ...
- 使用crf++
在example文件夹下存在4个使用crf的实例 1.在命令行执行 进入路径:./example/seg 执行:sh exec.sh 2. 在python中执行 进入路径:./python 执行:(1 ...
- MyBatis中的缓存1
1.应用程序和数据库交互的过程是一个相对比较耗时的过程 2.缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行的xiaolv 3.MyBatis中默认SqlSession缓存开启 3.1 同 ...
- sqlserver的substring详细用法
SQL 中的 substring 函数是用来截取一个栏位资料中的其中一部分. 例如,我们需要将字符串'abdcsef'中的‘abd’给提取出来,则可用substring 来实现: select sub ...
- 2019.01.09 bzoj2599: [IOI2011]Race(点分治)
传送门 题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. 思路: 考虑点分治如何合并. 我们利用树形dpdpdp求树的直径的方法,边dfsdfsdfs子树边统计答案即可. 代码: ...