04-01
一、网络协议和TCP/IP协议
IP地址和Port端口号:
本地回路的IP地址:127.0.0.1
UDP和TCP区别
TCP:传输控制协议,是面向连接的通信协议
UDP:用户数据报协议,是无连接的通信协议
UDP和TCP数据帧格式简单图例
协议类型 |
源IP |
目标IP |
源端口 |
目标端口 |
帧序号 |
帧数据 |
协议类型用于区分UDP和TCP
二、Socket:是网络驱动层提供给应用程序编程的接口和一种机制。
Socket可以比喻成港口码头
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立联系,告诉自己所对应的IP和Port
三、JAVA中的网络编程类
位于Java.Net包中
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务器端
Socket用于TCP通信的客户端和服务器
04-02:
DatagramSocket三个构造函数:
Public DatagramSocket();
Public DatagramSocket(int port);
Public DatagramSocket(int port,InetAddress laddr);
Close()
DatagramPacket是发送和接受数据的集装箱
构造函数:
public DatagramPacket(byte[] btf,int length);
public DatagramPacket(byte[] btf,int length, InetAddress laddr,int port);
InetAddress是表示计算机IP地址的一个类,具有getName()(静态方法)和getHostAddress()方法
getInetAddress和getPort()
getData()和getLength()
最简单的UDP程序:
1、 字符串和字节数组之间的双向转换
2、 UDP接收程序必须先启动,才能接收UDP发送程序发送的数据
3、 用Start命令打开新命令窗口的好处
4、 解决了发送字符串中文问题
发送程序:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UdpSend {
public static void main(String[] args) throws Exception {
DatagramSocket ds=new DatagramSocket();
String info="黑马程序员开课啦!";
ds.send(new DatagramPacket(info.getBytes(),info.getBytes().length,InetAddress.getByName("192.168.1.2"),3000));
ds.close();
}
}
接收程序:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpRecv {
public static void main(String[] args) throws Exception {
DatagramSocket ds=new DatagramSocket(3000);
byte [] btf=new byte[1024];
DatagramPacket dp=new DatagramPacket(btf,1024);
ds.receive(dp);
System.out.println(new String(dp.getData(),0, dp.getLength())+":"+
dp.getAddress().getHostAddress()+":"+dp.getPort());
ds.close();
}
}
04-03
用UDP编写网络聊天室
package frame;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class Chat extends Frame {
List list=new List(6);
TextField tfIP= new TextField(15);
TextField tfData= new TextField(20);
DatagramSocket ds=null;
public Chat(){
try {
ds=new DatagramSocket(3000);
} catch (SocketException e1) {
e1.printStackTrace();
}
this.add(list,"Center");
Panel p=new Panel();
this.add(p,"South");
p.setLayout(new BorderLayout());
p.add(tfIP,"West");
p.add(tfData,"East");
new Thread(new Runnable(){
public void run() {
byte [] btf1=new byte[1024];
DatagramPacket dp2=new DatagramPacket(btf1,1024);
while(true){
try {
ds.receive(dp2);
list.add(new String(dp2.getData(),0, dp2.getLength())+":"+
dp2.getAddress().getHostAddress()+":"+dp2.getPort());
} catch (IOException e) {
if(!ds.isClosed()){
e.printStackTrace();
}
}
}
}
}).start();
tfData.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
byte [] btf=tfData.getText().getBytes();
DatagramPacket dp;
try {
dp = new DatagramPacket(btf,btf.length,InetAddress.getByName(tfIP.getText()),3000);
ds.send(dp);
} catch (Exception e1) {
e1.printStackTrace();
}
tfData.setText("");
}
});
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
}
public static void main(String[] args) {
System.out.println("程序正在启动.....请稍等!");
Chat mainFrame=new Chat();
mainFrame.setSize(300,400);
mainFrame.setTitle("聊天程序");
mainFrame.setVisible(true);
mainFrame.setResizable(false);
}
}
广播Ip地址为:255