长沙旅游网站开发/网站关键词排名快速提升
本篇文章主要分享一下网络编程学习的基本内容:
一,基于TCP协议的网络编程
先来看一下什么是TCP协议?
- Java提供的网络功能有三大类: URL, Socket, Datagram.
- URL是三大功能中最高级的一种,通过URL Java程序可以直接送出或读入网络上的数据.
- Socket是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道.
- Datagram是更低级的网络传输方式,它把数据的目的纪录在数据包中,然后直接放在网络上.
接着我们需要了解一下端口的相关知识:
- 在面向连接的通信中,一个应用程序与另一个应用程序的连接的建立是通过把一个端口号绑定在套接字上实现的。这样就把应用程序注册在操作系统中,从指定的端口接收所有的数据。运行在同一台计算机上的两个应用程序不可能绑定在同一个端口上,如果应用程序试图绑定在一个已经在使用中的端口上将导致失败。在面向消息的通信中,数据报包含了目的地的端口号。TCP和UDP协议是利用端口把流入的数据映射到运行的计算机上的特定进程。
- 端口号是从0到65535(因为端口是用16位二进制数表示),其中0~1023的端口号被系统保留,它们被许多知名的服务占据,如HTTP、FTP和其他的系统服务,应用程序不能绑定这些端口。
Socket
- Socket:两个java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端,称为socket
- ServerSocket专门用于建立服务器端的Socket应用
方法 | 说明 |
ServerSocket() | 用于建立一个Socket,未绑定端口 |
ServerSocket(int port) | 用指定的端口port来创建一个侦听Socket |
ServerSocket(int port,int backlog) | 加上一个用来改变连接队列长度的参数backlog |
ServerSocket(int port,int backlog,InetAddress localAddr) | 在机器存在多个 IP地址的情况下,允许通过localAddr这个参数来指定侦听的IP地址 |
常用构造方法:
方法 | 说明 |
Socket() | 建立一个没有连接的Socket; |
Socket(InetAddress address, int port) | 建立一个指定主机IP地址address、端口port上的Socket连接; |
Socket(String host, int port) | 建立一个指定主机名称host、端口port上的Socket连接; |
下面我们。
代码实例:
在这里我简单的举一个单人聊天的例子:
package danren;
/*** 服务器端*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;public class ServiceTest {public static void main(String[] args) {try {/*ServerSocket创建服务器,给服务器设置端口号 (9999)* 端口号的范围0-65535,0-1023 系统默认使用的 8080(Tomcat),3306,3309(mysql) 1024(orcal)等等 */ServerSocket serSocket = new ServerSocket(9999);/** Socket 两个java应用程序进行相互交互数据* 套接字:IP地址和端口号的统称*/Socket socket = serSocket.accept();//监听 客户端是否连接上服务器System.out.println(socket.getInetAddress().getHostName()+"连接成功");Scanner sc = new Scanner(System.in);//通过socket 将数据发送给客户端BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));while(true){String str = sc.nextLine();bw.write(str);//通过bw.write将数据写到指定的路径(客户端)bw.newLine();//换行bw.flush();//刷新String mass = br.readLine();System.out.println("读取客户端内容:"+mass);}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
注意:只能先启动服务端后在启动服务端,并且必须客户端先发消息服务端才能发消息。
package danren;
/*** 客户端*/
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;public class ClientTest {public static void main(String[] args) {try {/** 通过Socket 创建客户端* ServerSocket 创建服务器端* Tcp:是一个需要网络连接的 可靠的协议 需要通过客户端连接服务器(端到端的连接)* Socket 中第一个参数为IP地址,127.0.0.1:本地ip地址* 9999为端口号* */Socket socket = new Socket("127.0.0.1", 9999);//客户端连接服务器//服务器发送的内容 客户端读取BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));Scanner sc = new Scanner(System.in);//将数据发送给服务器BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));while(true){String str = br.readLine();System.out.println("读取服务器的内容:"+str);String message = sc.nextLine();bw.write(message);bw.newLine();bw.flush();}} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
TCP也可以创建多人聊天,这里不做演示,简单写一下设计思路。
第一个是服务端的设计:
- 首先一样是先创建服务端,在服务端中创建一个静态的客户端集合来保存接入的客户端。
- 然后就是在死循环中不断的创建客户端端口,等待客户端的接入,将接入的客户端放入客户端集合中,不断运行接入服务端的线程。
- 其次要用到多线程的设计,创建一个服务端的线程,并在线程中添加客户端类的封装属性,在线程中不断的收取客户端信息,遍历静态客户端集合并将信息转发到每一个客户端。
接着是客户端的设计:
- 首先与上面的客户端一样,创建一个socket,接入服务端的端口,不同的是加上一个死循环来不断的读取发送来的信息并打印,并且要一直运行客户端线程。
- 客户端线程中也要提供客户端类的封装属性,并在Run方法中不断的调用Scanner对象来写入信息。
注意:收发信息都要使用字符流,因为字符流的flush()方法是直观决定信息发送与读取与否的关键。
二,基于UDP协议的网络编程
构造方法:
常用方法:
代码演示:
演示一:
/*** UDP接收端,运行是需要先运行**/
public class UDPClientDemo {
public static void main(String[] args) throws IOException {
//创建UDP协议的Socket对象
DatagramSocket ds = new DatagramSocket(5000);//在此端口进行监听
System.out.println("接收端正在等待接收数据...");byte[] bytes = new byte[1024];
//创建一个数据报对象
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp);//接收数据,该方法会造成阻塞
String info = new String(dp.getData(),0,dp.getLength());//从数据包中提取数据
System.out.println(info);
ds.close();
}}
public class UDPServerDemo {
public static void main(String[] args) {
try {
//创建一个UDP协议的 Socket对象
DatagramSocket ds = new DatagramSocket(3000);//从哪个端口发送出去
String info = "小新有一只狗,小时候叫小白,大了叫大白,老了叫老白,死了就是白白!";
//把数据转换成字节数组
byte[] bytes = info.getBytes();
//创建一个数据报包对象,参数(要发送的字节数组,数组起始位置,要发送数组的长度,InetAddress,接收端端口号)
DatagramPacket data = new DatagramPacket(bytes,0,bytes.length,InetAddress.getByName("127.0.0.1"),5000);
ds.send(data);//发送数据报
System.out.println("发送完毕");
ds.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}}}
演示二:
package udp;
/*** 目标地址:相当于服务端*/
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class ResTest {public static void main(String[] args) {try {DatagramSocket dgs = new DatagramSocket(8888);byte[] b = new byte[1024];//定义字节数组 将发送的数据放入到字节数组中DatagramPacket dgp = new DatagramPacket(b, b.length);//定义数据报包dgs.receive(dgp);//将接受的数据放入到数据报包中//将获取的数据转换为字符串 dgp.getData():获取接收的数据 0:数组索引0开始 dgp.getLength():获取内容(byte)数组的长度String str = new String(dgp.getData(), 0, dgp.getLength());System.out.println(str);//打印信息} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
package udp;
/*** 发送方:相当于客户端*/
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class SendTest {public static void main(String[] args) {try {DatagramSocket dgs = new DatagramSocket(1234);String message = "CSDN的UDP网络传输协议演示";byte[] b = message.getBytes();//将字符串转换为字节保存到字节数组中/** 数据报包 将字节数组(内容)打包发送到对方* b:字节数组* b.length:数组长度* InetAddress.getByName(ip地址):对方的ip地址* 8888:代表对方的端口号*/DatagramPacket dgp = new DatagramPacket(b, b.length, InetAddress.getByName("127.0.0.1"), 8888);dgs.send(dgp);//发送数据} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
UDP相当于一个邮件的信息传递方式。
小结:
UDP与TCP的区别:
- TCP需要网络连接的一个可靠的协议 安全 (创建服务器ServerSocket Socket连接服务器)
- UDP 不需要网络连接的 协议 不安全(DatagramSocket 负责发送或接受数据的, 将数据打包(字节)发送给对方)
实战代码:https://blog.csdn.net/hu_belif/article/details/81675911
以上便是本人的学习总结,欢迎批评建议,感谢采纳。