一:
网络通信中要有主机(host).而后主机上需要为应用分配端口号(port),这样同样的程序在不同主机间才可以建立通信。可用端口号1024~65535,0~1024为系统保留端口号。
127.0.0.1 本地IP回环地址
网际层协议:IP协议
传输层协议:TCP协议、UDP协议
应用层协议:HTTP、FTP等。
UDP的特点:将数据及源和目的封装在大小限制在64K内的数据包中,不需要建立连接,速度快,也因此是不可靠协议。
TCP的特点:需要建立连接形成传输数据的同道,在连接中进行大数据量传输,因为必须建立连接,导致效率会稍低,但通过三次握手完成连接,是可靠协议。
Java网络编程就是指Socket编程,通信的两端都有Socket,数据在两个Socket间通过IO传输。
Socket可以比喻为码头,两端都要有码头,才可以相互传递信息。
DatagramScoket 是UDP协议的Socket对象,DatagrepPacket是数据包对象,
DatagramScoket 作为接收端的时候需要在构造时指定端口号,发送端在发送时指定接收端端口号,
DatagrepPacket对象使用send方法将DatagrepPacket数据包发送出去。
Socket是TCP协议的对象,ServerSocket是TCP协议的服务器对象。
TCP是面向连接的,在建立Socket服务时,就要有服务端存在,形成通路,在该通道进行数据的传输。
阻塞式方法会导致线程sleep
二:UDP小Demo
public class UDPDemo {
/**
* UDP协议通信的Demo
* @param args
* @throws SocketException
*/
public static void main(String[] args) throws SocketException {
//开启发送端线程
new Thread(new Runnable() {
DatagramSocket sender = new DatagramSocket();//发送端
@Override
public void run() {
// TODO Auto-generated method stub
try{
// 接受控制台输入的信息
System.out.println("输入后回车发送");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=br.readLine()) != null){
// bye 为退出触发语句
if("exit".equals(line)) break;
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,
InetAddress.getByName("localhost"), 7777);
//发送数据包
sender.send(dp);
}
}catch(Exception e){
System.out.println("--发送端异常--");
e.printStackTrace();
}
}
}).start();
//开启接收端线程
new Thread(new Runnable() {
DatagramSocket recever = new DatagramSocket(7777);//接收端
@Override
public void run() {
try{
while(true){
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
recever.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println("ip:" + ip + "传来的数据:");
System.out.println(data);
}
}catch(Exception e){
System.out.println("--接收端异常--");
e.printStackTrace();
}
}
}).start();
}
}