网络通信的三要素
1.IP地址:
计算机在网络上的唯一标识,IPv4的IP地址标识方法为点分十进制(例如:192.168.0.1),IPv6的IP地址标志方法为冒分十六进制X:X:X:X:X:X:X:X 。回环地址127.0.0.1
2.端口号:
应用程序在计算中的唯一标识, 值域 0 - 65535, 建议使用一万以上
0-1024 系统程序默认占用 或者保留端口号
3.协议
UDP协议
不需要建立连接
发送数据有限制,最大传输 64K
只管发送 不保证接收
速度快
发送数据报包 / 解析数据报包
TCP协议
需要建立连接
发送的数据没有大小限制
一定能够保证接收到
速度略慢
通过socket对象中InputStream和OutputStream写入和读取数据
UDP发送
1:创建发送端DatagramSocket()
2:数据打包DatagramPacket(byte[] bs,length,InetAddress,port)
3:调用socket的发送方法send()
4:释放资源
UDP接收
1:创建接收端DatagramSocket(端口号)
2:定义数据包DatagramPacket
3:调用receive()接收数据
4:解析数据
5:释放资源
示例:采用UDP协议实现两个双向通信。
//Server端
public class Server {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(8888);
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
new Thread(){
@Override
public void run() {
DatagramSocket ds = null;
Scanner sc = new Scanner(System.in);
System.out.println("Server:");
try {
ds = new DatagramSocket();
while(true){
byte[] bt = sc.nextLine().getBytes();
DatagramPacket dp = new DatagramPacket(bt, bt.length, InetAddress.getByName("127.0.0.1"), 8989);
ds.send(dp);
if(new String(bt).equals("88")){
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ds.close();
sc.close();
}
}.start();
while(true){
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength());
System.out.println(str);
if(str.equals("88")){
break;
}
}
ds.close();
}
}
//Client端
public class Server {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(8888);
DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
new Thread(){
@Override
public void run() {
DatagramSocket ds = null;
Scanner sc = new Scanner(System.in);
System.out.println("Server:");
try {
ds = new DatagramSocket();
while(true){
byte[] bt = sc.nextLine().getBytes();
DatagramPacket dp = new DatagramPacket(bt, bt.length, InetAddress.getByName("127.0.0.1"), 8989);
ds.send(dp);
if(new String(bt).equals("88")){
break;
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ds.close();
sc.close();
}
}.start();
while(true){
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength());
System.out.println(str);
if(str.equals("88")){
break;
}
}
ds.close();
}
}
TCP发送
1:创建发送端socket(Ip,端口号)
2:获取socket对象的输出流
3:写出数据
4:释放资源
TCP接收
1:创建接收端ServerSocket(port)
2:监听是否有socket对象建立连接 accept()
3:获取socket对象的输入流
4:读取数据
5:释放资源
示例:采用TCP协议实现两个双向通信。
//Server端
public class ServerDemo {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(9999);
Socket sk = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
String str = null;
new Thread(){
@Override
public void run() {
try {
Thread.currentThread().sleep(5000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Socket skClient = null;
BufferedWriter bw = null;
try {
skClient = new Socket(InetAddress.getByName("127.0.0.1"), 8888);
bw = new BufferedWriter(new OutputStreamWriter(skClient.getOutputStream()));
BufferedReader br1 = new BufferedReader(new InputStreamReader(System.in));
while(true){
String str1 = null;
System.out.print("Server:");
str1 = br1.readLine();
bw.write(str1);
bw.newLine();
bw.flush();
if(str1.equals("88")){
break;
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
while((str = br.readLine()) != null){
System.out.println(str);
if(str.equals("88")){
break;
}
}
}
}