网络编程: Socket编程
网络编程的三个要素:
传输协议:
UDP协议:
面向无连接的协议,速度快,不安全
TCP协议:
面向有连接的协议,速度稍慢,安全,会进行三次握手操作
使用UDP进行数据的传输:
2: 把要发送的数据 ,封装成 数据报包 使用DatagramPacket对象完成
3: 发送数据报包, send(dp)方法
2; 创建空的数据报包, 用来存储接收到的数据
3: 接收数据,把数据存储到空的数据报包中
4: 解析数据报包中的数据
获取IP地址 getAddress();
获取数据: getData();
获取数据的长度: getLength();
5: 关闭Socket流,使用close()方法
使用TCP进行数据的传输:
客户端;
1: 创建客户端的Socket对象
2: 准备要发送的数据
3: 通过Socket对象中的输出流,完成数据的发送
4: 告知服务器 ,数据已发送完毕, shutdownOutput()
5: 获取服务器的反馈信息
6; 关闭Socket流
服务器端:
1: 创建服务器端ServerSocket对象
2: 等待客户端的连接
String ip = s.getInetAddress().getHostAddress();
b: 获取数据
1): 获取客户端的输入流对象
2): 通过输入流对象, 读取流中的数据
3): 把数据进行处理(打印,存储到文件中)
c: 编写客户端反馈信息
1): 获取客户端的输出流对象
2): 写 给客户端的反馈信息
d: 关闭客户端Socket流
网络编程的三个要素:
IP地址:
IP地址的分类:
A: 1.0.0.1 -- 127.255.255.254 10.x.x.x 是私有地址
B类 128.0.0.1---191.255.255.254 172.16.0.0---172.31.255.255是私有地址。169.254.X.X是保留地址。
C类 192.0.0.1---223.255.255.254 192.168.X.X是私有地址
D类 224.0.0.1---239.255.255.254
端口号:
传输协议:
UDP协议:
面向无连接的协议,速度快,不安全
用来视频聊天,语音聊天
TCP协议:
面向有连接的协议,速度稍慢,安全,会进行三次握手操作
数据的传输
使用UDP进行数据的传输:
发送端:
2: 把要发送的数据 ,封装成 数据报包 使用DatagramPacket对象完成
3: 发送数据报包, send(dp)方法
4: 关闭Socket流, 使用close()方法
public static void main(String[] args) {
System.out.println("启动发送端");
DatagramSocket ds = null;
try {
<span style="white-space:pre"> </span>//<span style="font-size:24px;">创建UDP协议的发送端DatagramSocket对象</span>
ds = new DatagramSocket();
//<span style="font-size:24px;">把要发送的数据 ,封装成 数据报包 使用DatagramPacket对象完成</span>
<span style="font-size:24px;"><span style="white-space:pre"> </span>byte[] by = "我来了。。。。。。。".getBytes();</span>
<span style="font-size:24px;"> InetAddress ia = InetAddress.getByName("127.0.0.1");</span>
<span style="font-size:24px;">
<span style="white-space:pre"> </span>//<span style="font-size:24px;"> 发送数据报包, send(dp)方法</span>
ds.send(new DatagramPacket(by, by.length, ia, 10000));
} catch (SocketException e) {
System.out.println("端口无法应用");
return;
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
<span style="white-space:pre"> </span>//<span style="font-size:24px;"> 关闭Socket流, 使用close()方法</span>
ds.close();
}
}</span>
接收端:
2; 创建空的数据报包, 用来存储接收到的数据
3: 接收数据,把数据存储到空的数据报包中
4: 解析数据报包中的数据
获取IP地址 getAddress();
获取数据: getData();
获取数据的长度: getLength();
5: 关闭Socket流,使用close()方法
public static void main(String[] args) {
DatagramSocket ds = null;
try {
<span style="white-space:pre"> </span>//<span style="font-size:24px;">创建UDP协议的接收端DatagramSocket对象</span>
ds = new DatagramSocket(10000);
byte[] by = new byte[1024];
<span style="white-space:pre"> </span>//<span style="font-size:24px;"> 创建空的数据报包, 用来存储接收到的数据</span>
DatagramPacket dp = new DatagramPacket(by, by.length);
<span style="white-space:pre"> </span>//<span style="font-size:24px;">接收数据,把数据存储到空的数据报包中</span>
ds.receive(dp);
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>//<span style="font-size:24px;">解析数据报包中的数据 <span style="font-size:24px;">获取IP地址 getAddress();</span></span>
InetAddress ia = dp.getAddress();
<span style="white-space:pre"> </span>//<span style="font-size:24px;">获取数据: getData();</span>
System.out.println(ia.getHostAddress());
<span style="white-space:pre"> </span>//<span style="font-size:24px;">获取数据的长度: getLength();</span>
int in = dp.getLength();
String str = new String(by, 0, in);
System.out.println(str);
} catch (Exception e) {
} finally {
<span style="white-space:pre"> </span>//<span style="font-size:24px;">关闭Socket流,使用close()方法</span>
ds.close();
}
}
使用TCP进行数据的传输:
客户端;
1: 创建客户端的Socket对象
2: 准备要发送的数据
3: 通过Socket对象中的输出流,完成数据的发送
4: 告知服务器 ,数据已发送完毕, shutdownOutput()
5: 获取服务器的反馈信息
6; 关闭Socket流
public static void main(String[] args) {
Socket sk = null;
try {
// 创建客户端的Socket对象
sk = new Socket("127.0.0.1", 12345);
// 准备要发送的数据
String str = "我来了";
// 通过Socket对象中的输出流,完成数据的发送
OutputStream os = sk.getOutputStream();
os.write(str.getBytes());
// 告知服务器 ,数据已发送完毕, shutdownOutput()
sk.shutdownOutput();
// 获取服务器的反馈信息
InputStream is = sk.getInputStream();
byte[] by = new byte[1024];
int len = is.read(by);
str = new String(by, 0, len);
System.out.println(str);
} catch (Exception e) {
} finally {
//如果sk不为null则关闭流
if (sk != null) {
try {
// 关闭Socket流
sk.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
服务器端:
1: 创建服务器端ServerSocket对象
2: 等待客户端的连接
3: 创建线程对象,并启动,通过每个线程对象,来完成与客户端Socket对象
的数据传输
public static void main(String[] args) throws IOException {
// 创建服务器端ServerSocket对象
ServerSocket ss = new ServerSocket(11114);
while (true) {
// 等待客户端的连接
Socket s = ss.accept();
// 创建线程对象,并启动,通过每个线程对象,来完成与客户端Socket对象<span style="font-size:24px;">的数据传输</span>
new TcpServer(s).start();
}
}
String ip = s.getInetAddress().getHostAddress();
b: 获取数据
1): 获取客户端的输入流对象
2): 通过输入流对象, 读取流中的数据
3): 把数据进行处理(打印,存储到文件中)
c: 编写客户端反馈信息
1): 获取客户端的输出流对象
2): 写 给客户端的反馈信息
d: 关闭客户端Socket流
<span style="font-size:24px;">public class TcpServer extends Thread {
private Socket s;
public TcpServer(Socket s) {
super();
this.s = s;
}
@Override
public void run() {
// 获取IP地址
String str1 = s.getInetAddress().getHostAddress();
try {
// 获取数据
BufferedReader br = new BufferedReader(new
/* 通过输入流对象, 读取流中的数据 */InputStreamReader(
/* 获取客户端的输入流对象 */s.getInputStream()));
for (String str = ""; (str = br.readLine()) != null;) {
// 把数据进行处理(打印,存储到文件中)
System.out.println(str1 + ":" + str);
}
// 获取客户端的输出流对象
OutputStream os = s.getOutputStream();
// 写 给客户端的反馈信息
os.write("收到".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (s != null) {
try {
// 关闭客户端Socket流
s.close();
System.out.println(str1 + "已退出");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
</span>