关于TCP/UDP的基础知识点以及相关代码
1.计算机网络:多台计算连接起来,资源共享和信息传递。
网络编程:就是用来实现网络互联的不同计算机上运行的程序间可以进行数据交互。
2.网络三要素
①IP地址(InetAddress,网络号段+主机号段)
②端口号
③协议(UDP/TCP)
3.Socket
Socket:网络上具有唯一的标识,IP+端口构成的标识符套字节。
Socket的原理机制:
通信的两端都有Socket。
网络的通信其实就是Socket间的通信。
4.UDP/TCP
①UDP:用户数据协议,将数据分装成数据包,每个包大小限制64k,无连接,不可靠协议,传输速度快
②TCP:传输控制协议,建立连接,形成传输数据的通道,在连接中进行大量数据传输,通过三次握手建立连接,可靠性高,效率低
③UDP传输
发送端:a.建立发送端的Socket对象。
b.创建数据,并进行打包。
c.调用Socket方法进行发送。
d.关闭资源。
接收端:
a.创建接收端的Socket对象。
b.创建数据包,用于接收数据。
c.调用Socket的接收方法,将数据保存在包中。
d.从数据包中解析数据,并发送到控制台。
e.关闭资源。
④TCP传输
发送端: a.创建客户端的Socket对象(连接服务器端)。
b.获取输出流,给管道写数据。
c.关闭资源。
接收端:a.创建服务器端的ServerSocket对象(指定端口)
b.监听发送端。
c.获取客户端的Socket对象,从而获取输入流。
d.关闭资源
⑤如何提高UDP的性能
应用层实现超时重传,客户端发送一个包,服务器返回一个包表示收到,如果客户端超过一定的时间没有收到该包,就需要重传。
5.Socket编程
6.UDP字符串信息的发送与接收
UDP sent
public void UDPSend(){
DatagramSocket ds=new DatagramSocket(); //创建Socket对象
String str="Hello,world";
byte[] data=str.getBytes();
InetAddress
add=InetAddress.getByName("192.168.0.1"); //你所要发送的设备的IP地址
DatagramPacket dp=new DatagramPacket(data,data.length(),add,10012); //占用的端口号
ds.send(dp);
ds.close();
}
UDP receive
public void UDPReceive(){
DatagramSocket ds=new DatagramSocket(10012); //端口号要与发送端一致
byte[] data=new byte[1024]; //建立一个新字节数组,用于存放接收的数据
DatagramPacket dp=new DatagramPacket(data,data.length);
ds.receive(dp);
String str=new String(dp.getData(),0,dp.getLength());
System.out.println("这是来自"+dp.getAddress()+"的话:"+str);//打印输出到控制台
ds.close();
}
以上代码都需要进行异常处理。
7.UDP的输入型数据的收发
UDP sent
public void UDPSend2(){
DatagramSocket ds=new DatagramSocket();
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while(!(line=br.readLine().equals("88"))){
//当输入“88”字眼时 发送结束
byte[] data=line.getBytes();
InetAddress add=InetAddress.getByName("192.168.1.1");
DatagramPacket dp=new
DatagramPacket(data,data.length,add,10001);
ds.send(dp);
ds.close();
}
}
UDP receive
public void UDPReceive2(){
DatagramSocket ds=new DatagramSocket(10001);
while(true){
byte[] data=new byte[1024];
DatagramPocket dp=new DatagramPocket(b,b.length);
ds.receive(dp);
String str=new String(dp.getData(),dp.getLength());
System.out.println("这是来自"+dp.getAddress().getHostAddress()+"的消息:"+str);
//因为要接受来自不同计算机的消息,所以服务器不需要关闭
}
}
8.TCP的收发
TCP client(客户端)
public void clientDemo(){
Socket s=new Socket("192.168.1.1",10086);
OutputStream os=s.getOutputStream();
os.write("Hello,java!");
InputStream is=s.getInputStream(); //接收服务器的反馈
byte[] byt=new byte[1024];
int len=is.read(byt); //以byte[]的长度读入信息
String answer=new String(byt.0,len);
System.out.println("client:"+answer);
s.close();
}
TCP(服务器端)
public void serverDemo(){
ServerSocket ss=new ServerSocket(10086);
Socket s=ss.accept();
InputStream is=s.getInputStream();
byte[] byt=new byte[1024];
int len=is.read(byt);
String str=new String(bye,0,len);
System.out.println("来自"+s.getAddress.getHostAddress+"的消息:"+str);
OutputStream os=s.getOutputStream();
os.write("数据收到!".getBytes());
s.close(); //ss.close(); 服务器不能关闭。
}
9.用多线程的方式实现聊天室(UDP)
public class ReceiveDemo implements Runnable{
private DatagramSocket ds;
public ReceiveDemo(DatagramSocket ds){
this.ds=ds;
}
public void run(){
while(true){
byte[] byt=new byte[1024];
DatagramPacket dp=new DatagramPacket(byt,byt.length);
ds.receive(dp);
String s=new String(dp.getData(),dp.getLength());
System.out.println("来自"+dp.getInetAddress().getHostAddress()+"的信息"+s);
}
}
}
public class SendDemo implements Runnable{
private DatagramSocket ds;
public SendDemo(DatagramSocket ds){
this.ds=ds;
}
public void run(){
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while(!(line=br.readLine()).equals("88")){
byte[] byt=line.getBytes();
InetAddress
add=InetAddress.getByName("192.168.1.255"); //255为广播IP
DatagramPocket dp=new DatagramPoket(byt,byt.length,add,10086);
ds.send(dp);
}
ds.close();
}
}
测试代码:
public class charRoom{
public static void main(String[] args){
DatagramSocket ds_send=new DatagramSocket();
DatagramSocket ds_receive=new DatagramSocket(10086);
ReceiveDemo rd=new ReceiveDemo(ds_receive);
SendDemo sd=new SendDemo(ds_send);
new Thread(rd).start();
new Thread(sd).start();
}
}