1 IP地址:Java类中的InetAddress对象
2 TCP和UDP
3 Socket
4 UDP模式下,实现数据的传输与接受
5 结合多线程实现聊天功能
1 IP地址:Java类中的InetAddress对象
对InetAddress的简单操作
public static void UDPPartern_IP(){
try {
InetAddress ip = InetAddress.getLocalHost();//得到本地IP地址
System.out.println(ip.getAddress());
System.out.println(ip.getHostAddress());//IP地址
System.out.println(ip.getHostName());//主机名称
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
2 TCP和UDP
2.1 UDP
1 将数据及源和目的封装成数据包中,不需要建立连接
2 每个数据包的大小限制在64K内
3 因无需连接,是不可靠协议
4 不需要建立连接,速度快
2.1 TCP
1 建立连接,形成传输数据的通道。
2 在连接中进行大数据量传输。
3 通过三次握手完成连接,是可靠协议
4 必须建立连接,效率会稍低
3 Socket
Socket就是为网络服务提供的一种服务机制
通信两端都有Socket。
网络通信其实就是Socket之间的通信
数据在两个Socket间通过IO传输
4 UDP模式下,实现数据的传输与接受
代码如下,发送端发送数据:
public static void UDPPartern_send(){
try {
//1 创建UDP服务.通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket();
//2 确定数据,并将其封装为数据包
byte[] buf = "udp ge men lai le".getBytes();
//将数据发送到本机地址上1234端口
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()),1234);
//3 发送数据
ds.send(dp);
//4 关闭资源
ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
接受端接受数据:
public static void UDPPartern_receive(){
try {
//1 创建UDP服务.通过DatagramSocket对象
DatagramSocket ds = new DatagramSocket(1234);
//2 确定数据,并将其封装为数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3 发送数据
ds.receive(dp);
System.out.println("addressName"+dp.getAddress().getHostAddress());
String data = new String(dp.getData(),0,dp.getLength());
System.out.println("data"+data);
//4 关闭资源
ds.close();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
5 结合多线程实现聊天功能
在继续扩展,将发送和接收各自作为一个线程,通过开启两个线程,一个负责读取键盘录入数据并发送,另一个负责接受发送数据。
代码如下:
发送端:
public class Socket_send implements Runnable{
private DatagramSocket ds;
public Socket_send(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
try {
//2 确定数据,并将其封装为数据包
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bf.readLine())!=null){
if("886".equals(line)){
break;
}
byte[] buf = line.getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length,InetAddress.getByName(InetAddress.getLocalHost().getHostAddress()),12002);
ds.send(dp);
//注意最后不能关闭。如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,会导致异常
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
接收端:
public class Socket_receive implements Runnable{
private DatagramSocket ds;
public Socket_receive(DatagramSocket ds){
this.ds = ds;
}
@Override
public void run() {
while(true){
try {
//2 确定数据,并将其封装为数据包
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
//3 发送数据
ds.receive(dp);
System.out.println("addressName: "+dp.getAddress().getHostAddress());
String data = new String(dp.getData(),0,dp.getLength());
System.out.println("data: "+data);
//注意最后不能关闭。如果一端的Socket被关闭(或主动关闭或者因为异常退出而引起的关闭),另一端仍发送数据,会导致异常
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
上面程序通过监听某个IP地址下的某个端口,实现信息的发送和接收,聊天功能的基础就是基于此的!
另外,要能够将自己所学的知识适时的运用,这很重要!
END