一.网络简介与说明
为了实现两台计算机通信,必须有一个网络线路连接两台计算机。通常,由服务端,网络,客户端组成。有时,很难将服务端与客户端进行区分,因为两者是相对概念。通常,我们说的局域网(LAN)及时就是一群通过一定形式连接起来的计算机,可以由两台计算机组成,也可以由上千台计算机组成。将(LAN)延伸到更大的范围,就是广域网(WAN),我们通常说的因特网(Internet)就是无数个LAN与WAN共同组成的。
二.网络协议
2.1 IP协议
Internet网络采用的协议是TCP/IP协议,在全球范围内实现不同主机的互联,在互联网中,每台主机在网络上用ip地址代表自己。目前,ip地址用的是4个字节,也就是32位的二进制数来表示,称为IPv4,为了方便使用,通常取用每个字节的十进制数,并且每个字节之间用圆点隔开来表示IP地址,例如,192.168.1.1
2.2 TCP/UDP协议
在TCP/IP协议中,有两个高级协议是程序员应该熟悉的,即TCP(传输控制协议)与UDP(用户数据报协议)。
TCP协议保证两台计算机之间可靠的额传输数据,而且抵达的数据排列顺序与发送时的顺序一致,TCP协议适合对可靠性要求比较高的场合,例如,打电话,必须先拨通 ,等双方都连接后,才能互相通信。
UDP是无连接通信协议,不能保证可靠的数据传输,但是能够向若干个目标发送数据,UDP是以独立发送数据包的方式进行。UDP适合准确性不是很高的场合,例如,聊天室。UDP适应对传输速度和时效性要求较高的场合,及时以小部分数据丢失,或者顺序不同,不也影响。
三.端口与套接字
端口并非真实的物理存在,而是一个假想的连接,端口被定义在0~65535之间的整数,HTTP服务一般使用80端口,FTP服务一般使用21端口。0~1023之间的端口一般用于知名的网络服务和应用,用户自定义端口最好是在1024以上的,避免端口号发生冲突。
网络程序中的套接字(Socket)用于将应用程序与端口连接起来。
四.UDP以及Demo
udp的通信基本模型:1.将数据包发送到目的地;2.接受别人发来的数据包。
4.1 发送数据包的过程
(1)使用DatagramSocket( )创建一个数据包套接字。
(2)使用DatagramPacket(byte[] buf, int length, InetAddress address, int port)创建要发送的数据包。
(3)使用DatagramSocket类的send( )方法发送数据包
4.2 接收数据包的过程
(1)使用DatagramSocket( int port)创建一个数据包套接字,并绑定在指定端口。
(2)使用DatagramPacket(byte[] buf, int length)创建要接受的数据包。
(3)使用DatagramSocket类的receive( )方法接受数据包。
注意:DatagramSocket类的receive( )方法是个阻塞方法,一直等待网络上的数据。
4.3 Demo演示
首先,需要写一个server,一个client。我们在client中发送一句话"hello , I am client",然后把这句话通过udp发送出去,在server端去接受udp消息,并且进行打印。
以上是client端的代码,只是往2255端口发送一句"hello, I am client"。接下来是server端的代码。
同样,很简单,只是在server端监听2255端口,当有消息发送过来的时候,再去打印 ,运行后,可以直接在server端的console窗口看到打印的 server get : hello , I am client 表示成功,这只是最简单的方式。还可以在server端收到数据后,再给client返回数据,client同样去监听,然后获取数据。ps:一般与网络相关的代码都不会放在主线程中去处理,会新建一个线程去做处理。
五.TCP以及Demo
tcp一般是用Socket类编写,也是分为server端,client端。两者是有主次之分的!两者的功能与编写方法大不一样。
5.1 服务器程序创建一个ServerSocket,调用accept( )方法等待客户机的连接。
5.2 客户端创建一个Socket,请求与服务器建立连接。
5.3 服务器接受客户端的请求连接,同时创建一个新的Socket与客户建立连接。
ps:ServerSocket一次可以与一个Socket连接,如果多台client同时请求,ServerSocket会把请求连接的Client放入一个队列中,队列默认大小是50,当超过50时,请求会被拒绝。
5.4 Demo演示
同样与UDP一样,首先写client端的代码,代码很简单,具体过程
public class TCPClient {
Socket socket;
BufferedWriter bufferedWriter;
public void sendData() {
try {
InetAddress inetAddress = InetAddress.getLocalHost();//本例为示例,所以发送的地址均为本机
int port = 8998;//定义发送的端口号
socket = new Socket(inetAddress, port);//创建socket对象
String mString = "Hello,YYQ";
OutputStream outputStream = socket.getOutputStream();//socket绑定输出流
outputStream.write(mString.getBytes());
socket.close();//关闭socket
outputStream.close();//关闭流
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
TCPClient tcpClient = new TCPClient();
tcpClient.sendData();
}
}
以上就是是client端的代码,接下来是server端的代码
public class TCPServer {
private BufferedReader bufferedReader;
private ServerSocket serverSocket;
private Socket socket;
public void receice() {
try {
serverSocket = new ServerSocket(8998);//ServerSocket监听8998端口,同时client发送到这个端口
while(true) {
System.out.println("等待客户机连接...");
socket = serverSocket.accept();//建立socket连接,用serversocket的accept()方法。
bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream()));//socket中读取输入流
System.out.println("从客户机读到的数据是: " + bufferedReader.readLine());
try {
if(bufferedReader != null) {
bufferedReader.close();//关闭流
}
if(socket != null) {
socket.close();//关闭socket
}
} catch (Exception e) {
// TODO: handle exception
}
}
} catch (Exception e) {
// TODO: handle exception
}
}
public static void main(String[] args) {
TCPServer tcpServer = new TCPServer();
tcpServer.receice();
}
}
server端监听8998端口,当client没有发送数据的时候,会打印“等待客户机连接”,当收到数据的时候,会打印出来。
运行server端代码,之后运行client端代码。代码执行结果为:
等待客户机连接...
从客户机读到的数据是: Hello,YYQ
等待客户机连接...
已经表示server端成功收到client端的代码。
六.小结
关于java 的网络通信已经全部介绍完毕,包括TCP/UDP。这篇文章只是最简单的示例与说明,更复杂的情况还需要工作中继续学习。本篇文章著作权是本人,如需转载,请联系本人,或者附上本文链接,谢谢合作!