网络通讯三个要素:
1,IP地址:InetAddress,网络中设备的标识,也可用与其对应的主机名代替。
本地默认回环地址:127.0.0.1 主机名:localhost
2,端口:用于标识进程的逻辑地址,不同进程的标识不同。
有效端口:0~65535,其中0~1024为系统使用或者保留。
3,传输协议:通讯的规则。
常见协议:TCP、UDP。
UDP传输协议的特点:
1,面向无连接
2,需要将传输的数据打包,大小不能超过64k以内
3,因为无连接,所以是不可靠协议
4,不需要建立连接,速度快
用java进行网络编程的话,就必须要了解一个重要的概念:Socket
1,socket就是为网络提供的一种机制
2,通信的两端都有socket
3,网络通信其实就是socket间的通信
4,数据在两个 socket间通过IO传输
UDP传输的Socket服务
1,DategramSocket与DatagramPacket
2,建立发送端,接收端
4,调用Socket的发送接收方法
5,关闭Socket
其中发送端和接收端是两个独立的运行程序
一个简单的获取ip和主机名的程序:
简单的UDP协议的网络传输:
定义一个UDP的传输,可以将键盘录入发送给接收方:
一个简单的聊天程序,使用多线程实现的网络编程:
/*
编写一个聊天程序,有收数据部分和发数据的部分。
这两部分需要同时执行,
那就需要用到多线程技术。
一个线程控制收,一个线程控制发。
因为收和发动作是不一致的,所以要定义两个run方法,
而且这两个方法要封装到不同的类中。
*/
import java.net.*;
import java.io.*;
class Send implements Runnable
{
private DatagramSocket ds;
public Send(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line=bufr.readLine())!=null)
{
if("886".equals(line))
break;
byte[] buf = line.getBytes();
DatagramPacket dp=
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),10002);
ds.send(dp);
}
}
catch(Exception e)
{
throw new RuntimeException("发送端失败");
}
}
}
class Receive implements Runnable
{
private DatagramSocket ds;
public Receive(DatagramSocket ds)
{
this.ds = ds;
}
public void run()
{
try
{
while(true)
{
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::"+data);
}
}
catch(Exception e)
{
throw new RuntimeException("接收失败");
}
}
}
class ChatDemo
{
public static void main(String[] args) throws Exception
{
DatagramSocket sendSocket = new DatagramSocket();
DatagramSocket receiveSocket = new DatagramSocket(10002);
new Thread(new Send(sendSocket)).start();
new Thread(new Receive(receiveSocket)).start();
}
}