java之socket
来源:互联网 发布:科技美学知乎 编辑:程序博客网 时间:2024/06/10 01:11
Java之socket
InetAddress类
public static InetAddressgetByName(String host):
(其他获取InetAddress对象的方法参考api手册)
根据主机名或者IP地址的字符串表示得到IP地址对象
主机名:public String getHostName()
IP地址public String getHostAddress()
端口
物理端口 网卡口
逻辑端口 我们指的就是逻辑端口
A:每个网络程序都会至少有一个逻辑端口
B:用于标识进程的逻辑地址,不同进程的标识
C:有效端口:0~65535,其中0~1024系统使用或保留端口。
通过360可以查看端口号
协议:
通信的规则
UDP:
把数据打包
数据有限制
不建立连接
速度快
不可靠
TCP:
建立连接通道
数据无限制
速度慢
可靠
协议UDP和TCP
UDP
将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快
TCP
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
Socket
Socket套接字:
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
Udp发送端代码
/*
* UDP协议发送数据:
* A:创建发送端Socket对象
* B:创建数据,并把数据打包
* C:调用Socket对象的发送方法发送数据包
* D:释放资源
*/
DatagramSocket ds = new DatagramSocket();
创建数据,并把数据打包
// DatagramPacket(byte[] buf, int length, InetAddress address,int port)
// 创建数据
byte[] bys ="hello,world".getBytes();
// 长度
int length = bys.length;
// IP地址对象
InetAddress address =InetAddress.getByName("192.168.12.92");
// 端口
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, address, port);
// 调用Socket对象的发送方法发送数据包
// public void send(DatagramPacket p)
ds.send(dp);
Udp接收端代码
/*
* UDP协议接收数据:
* A:创建接收端Socket对象
* B:创建一个数据包(接收容器)
* C:调用Socket对象的接收方法接收数据
* D:解析数据包,并显示在控制台
* E:释放资源
// 创建接收端Socket对象
// DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(10086);
// 创建一个数据包(接收容器)
// DatagramPacket(byte[] buf, int length)
byte[] bys =new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);
// 调用Socket对象的接收方法接收数据
// public void receive(DatagramPacket p)
ds.receive(dp); // 阻塞式
// 解析数据包,并显示在控制台
// 获取对方的ip
// public InetAddress getAddress()
InetAddress address =dp.getAddress();
String ip =address.getHostAddress();
// public byte[] getData():获取数据缓冲区
// public int getLength():获取数据的实际长度
byte[] bys2 = dp.getData();
int len = dp.getLength();
String s = new String(bys2, 0, len);
System.out.println(ip + "传递的数据是:" + s)
TCP传输
Socket和ServerSocket
建立客户端和服务器端
建立连接后,通过Socket中的IO流进行数据的传输
关闭socket
同样,客户端与服务器端是两个独立的应用程序。
客户端代码
/*
* TCP协议发送数据:
* A:创建发送端的Socket对象
* 这一步如果成功,就说明连接已经建立成功了。
* B:获取输出流,写数据
* C:释放资源
*
* 连接被拒绝。TCP协议一定要先看服务器。
*java.net.ConnectException: Connection refused: connect
*/
// 创建发送端的Socket对象
// Socket(InetAddress address, int port)
// Socket(String host, int port)
// Socket s = newSocket(InetAddress.getByName("192.168.12.92"), 8888);
Socket s = new Socket("192.168.12.92", 8888);
// 获取输出流,写数据
// public OutputStream getOutputStream()
OutputStream os =s.getOutputStream();
os.write("hello,tcp,我来了".getBytes());
// 释放资源
s.close();
服务器代码
/*
* TCP协议接收数据:
* A:创建接收端的Socket对象
* B:监听客户端连接。返回一个对应的Socket对象
* C:获取输入流,读取数据显示在控制台
* D:释放资源
*/
// 创建接收端的Socket对象
// ServerSocket(int port)
ServerSocket ss = new ServerSocket(8888);
// 监听客户端连接。返回一个对应的Socket对象
// public Socket accept()
Socket s = ss.accept(); // 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
// 获取输入流,读取数据显示在控制台
InputStream is =s.getInputStream();
byte[] bys =new byte[1024];
int len = is.read(bys);// 阻塞式方法
String str = new String(bys, 0, len);
String ip =s.getInetAddress().getHostAddress();
System.out.println(ip + "---" + str);
// 释放资源
s.close();
怎样告诉对方发送完毕
/*
* 正常情况下,如果连接不中断的时,接收信息的一方不会自己判断是否读完,所以会一直处于等待读信息状态,因此需要发送方告知读完的信息,socket的shutdownOuput()方法用于告知对方发送结束。
* public void shutdownOutput()
*/
- JAVA Socket之UDP
- Java-Socket之TCP
- java 基础之Socket
- java之socket编程
- java之socket编程
- Java之Socket开发
- JAVA之Socket编程
- Java之socket编程
- Java之Socket
- Java之socket
- java学习之socket
- JAVA之Socket编程
- java之socket编程
- java之socket
- java Socket 之 Datagram socket(UDP)
- Java Socket实战之八 socket提升
- java Socket 之 Datagram socket(UDP)
- Java Socket实战之八 socket提升
- JavaScript中的模块化开发
- linux 静态库和动态库的一些笔记
- 线程安全和线程不安全理解
- mysql 触发器案例
- JFianl自定义IOC工具
- java之socket
- 邮件读取协议POP3和IMAP
- FastBoot BootLoader Recovery 模式解释
- River Hopscotch poj3258 (二分+贪心思想+最小值最大化)
- 《Head First 设计模式》-抽象工厂模式C++实现
- zookeer
- windows 下redis在后台运行
- 方法记
- Unity协程以及迭代器