-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
一. 网络编程概述
a) 找到对方IP:网络中设备的标识,不易记忆,可用主机名,本机回环地址127.0.0.1
b) 数据要发送到对方指定的应用程序上,为了标识这些应用程序,所以给这些网络应用程序都用数字进行标识,为了方便称呼这个数字,叫做端口.逻辑端口.
i. 用于标识进程的逻辑地址,不同进程的标识
ii. 有效端口:0~65535其中0~1024系统使用或保留端口
c) 定义通信规则,这个通信规则称为协议,国际组织定义了通用协议,TCP/IP协议
i. UDP
1. 将数据及源和目的封装成数据包中,不需要建立连接
2. 每个数据包的大小限制在64K内
3. 因无连接,是不可靠协议
4. 不用建立连接,速度快.
ii. TCP
1. 建立连接,形成传输数据的通道
2. 在连接中进行大数据量传输
3. 通过三次握手完成连接,是可靠协议
4. 必须建立连接,效率会稍低.
二. Socket
a) Socket就是为网络服务提供的一种机制
b) 通信的两端都有Socket
c) 网络通信其实就是Socket间的通信
d) 数据在两个Socket间通过IO传输
e) 通过UDP传输方式,将一段文字数据发送出去
i. 建立udpsocket服务DatagramSocket ds = new DatagramSocket();
ii. 提供数据,并将数据封装到数据包中byte[] buf = “udp ge”.getBytes();DatagramPacket dp= newDatagramPacket(buf,buf.length,InetAddress.getByName(“192.168.1.254”),10000);
iii. 通过socket服务的发送功能,将数据包发出去ds.send(dp);
iv. 关闭资源ds.close();
f) 接收端
i. 定义udpsocket服务,通常都会监听一个端口,其实就是给这个接收网络应用程序定义数字标识.方便于明确哪些数据过来该应用程序可以处理.
ii. 定义一个数据包,因为要存储接收到的字节数据,因为数据包对象中有更多功能可以提取字节数据中的不同数据信息.
iii. 通过socket服务的receive方法将收到的数据存入已定义好的数据包中
iv. 通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上
v. 关闭资源
三. TCP传输
a) Socket和ServerSocket
b) 建立客户端Socket和服务器端ServerSocket
c) 建立连接后,通过Socket中的IO流进行数据传输
d) 关闭SOCKET
e) 同样,客户端与服务器端是两个独立的应用程序.
四. UDP聊天示例:
package com.jwd.black.chat;
import java.net.*;
importjava.io.*;
publicclass Receimplements Runnable {
private DatagramSocketds;
public Rece(DatagramSocketds) {
this.ds =ds;
}
@Override
publicvoid run() {
//TODO Auto-generatedmethod stub
try {
while (true) {
byte[]buf = newbyte[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 (Exceptione) {
thrownew RuntimeException("接收流失败");
}
}
}
package com.jwd.black.chat;
import java.net.*;
publicclass ChatDemo {
publicstaticvoid main(String[]args) throws Exception {
//TODO Auto-generatedmethod stub
DatagramSockets =newDatagramSocket();
DatagramSocketr =newDatagramSocket(10002);
new Thread(new Send(s)).start();
new Thread(new Rece(r)).start();
}
}
package com.jwd.black.chat;
import java.io.*;
import java.net.DatagramPacket;
import java.net.*;
publicclass Sendimplements Runnable {
private DatagramSocketds;
public Send(DatagramSocketds) {
this.ds =ds;
}
@Override
publicvoid run() {
//TODO Auto-generatedmethod stub
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.128"),10002);
ds.send(dp);
}
}catch(Exceptione){
thrownew RuntimeException("发送端失败");
}
}
}