网络编程(UDP)
网络编程的三要素:
1.IP:用来标识一台计算机(唯一性)
2.(逻辑)端口:用来标识某一进程的唯一性
3.传输协议:UDP/TCP
DOS:ipconfig /all :查看IP地址
DOS: hostnmae :查看主机名
UDP:
俩端(服务端,客户端)不需要建立就连接
传输的数据大小有限制,不超过64KB
不可靠连接(效率高)
TCP:
俩端需要建立连接
传输的数据大小没有限制
可靠连接(效率不高)
InetAddress
此类表示互联网协议(IP)地址
常用方法:
static InetAdress getByName(String host);
给定主机名的情况下确定主机名的IP地址
String host :主机名或IP字符串
1.getHostAdress():获取IP
2.getHostName():获取主机名
DatagramSocket
此类表示用来发送和接收数据报包的套接字
[发送端]
步骤:
创建客户端Socket 对象:DatagramSocket(int port:端口号(0~65535),InetAddress laddr)
创建数据报包的对象:DatagramPocket
发送:send
释放资源
代码:
public static void main(String[] args) throws Exception {
//创建发送端对象
DatagramSocket ds = new DatagramSocket();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入消息");
String s ;
while((s = br.readLine())!=null){
System.out.println("请输入消息");
byte[] buf = s.getBytes();
//创建数据报包
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.0.27"), 8887);
//发送
ds.send(dp);
}
//释放资源
ds.close();
}
}
[服务端]
步骤:
创建服务端Socket对象
创建数据报包用来接收数据
接收数据:receive
解析数据
释放资源
代码:
public static void main(String[] args) throws Exception {
// 建立服务端对象
DatagramSocket ds = new DatagramSocket(8887);
while (true) {
byte[] bys = new byte[1024];
// 创建数据报包用来接收对象
DatagramPacket dp = new DatagramPacket(bys, bys.length);
//接收数据
ds.receive(dp);
//解析数据
byte[] data = dp.getData();
System.out.println(new String(data,0,data.length));
}
}
结果:
请输入消息
你好
请输入消息
Hello
请输入消息
null
请输入消息
请输入消息
你好
Hello
null
需求:
编写程序,通过UDP协议,完成多线程版本的聊天室程序。
代码:
public class UDPClient implements Runnable {
DatagramSocket ds;
public UDPClient(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入消息");
String s;
try {
while ((s = br.readLine()) != null) {
System.out.println("请输入消息");
byte[] buf = s.getBytes();
// 创建数据报包
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("192.168.0.27"), 8887);
// 发送数据
ds.send(dp);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class UDPServer implements Runnable {
DatagramSocket ds;
public UDPServer(DatagramSocket ds) {
this.ds = ds;
}
@Override
public void run() {
try {
while (true) {
byte[] bys = new byte[1024];
// 创建数据报包用来接收对象
DatagramPacket dp = new DatagramPacket(bys, bys.length);
// 接收数据
ds.receive(dp);
// 解析数据
byte[] data = dp.getData();
System.out.println(new String(data, 0, data.length));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class UDPTest {
public static void main(String[] args) throws Exception {
// 创建服务端对象
DatagramSocket receive = new DatagramSocket(8887);
// 创建发送端对象
DatagramSocket send = new DatagramSocket();
// 启动线程
new Thread(new UDPServer(receive)).start();
new Thread(new UDPClient(send)).start();
}
}
结果:
请输入消息
nihao
请输入消息
nihao
请输入消息
再见
请输入消息
再见