Java网络编程实现

前言

计算机网路实现了多个网络终端的互联,彼此之间能够进行数据交流。而网络应用程序就是在已连接的不同终端设备上运行的程序,这些网络程序相互之间可以进行数据交互。网络程序的数据交互则依赖于TCP/IP协议,在实际应用中TCP网络程序提供可靠的数据通信,而UDP网络程序则不保证数据的可靠性,但是协议简单、传输速度快(比如用在音视频数据传输,它们不需要很高的可靠性,偶尔丢帧是可以忍受的)。

ServerSocket类

Java.net包中的ServerSocket类用于表示服务器套接字,其主要功能是监听客户端的请求,然后将客户端的请求连接存入队列中,默认请求队列大小是50。构造方法主要有以下几种形式:

ServerSocket():创建非绑定服务器套接字。

ServerSocket(int port):创建绑定到特定端口的服务器套接字。

ServerSocket(int port,int backlog):利用指定的backlog创建服务器套接字并将其绑定到指定的本地端口号。

ServerSocket(int port,int backlog,InetAdress bindAddress):使用指定的端口、监听backlog和要绑定到本地IP地址创建服务器,适用于计算机有多个网卡、多个IP的情景。

TCP网络程序实例

服务端程序代码

//服务端程序
import java.io.*;
import java.net.*;
public class MyTcpServer {
	private BufferedReader reader;
	private PrintWriter writer;
	private ServerSocket server;
	private Socket socket;
	void getserver(){
		try{
			server = new ServerSocket(8866);
			System.out.println("服务器套接字已经创建成功");
			while(true){
				System.out.println("等待客户机的连接");
				socket = server.accept();	//阻塞的
				reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
				writer = new PrintWriter(socket.getOutputStream(),true);
				getClientMessage();			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getClientMessage(){
		try{
			while(true){
				System.out.println("客户端信息接收:"+ reader.readLine());
				writer.println("欢迎您连接服务端");
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			if(reader != null){
				reader.close();
			}
			if(writer != null){
				writer.close();
			}
			if(socket != null){
				socket.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
}
public class Main {
	public static void main(String[] args) {
		MyTcpServer tcpserv = new MyTcpServer();
		tcpserv.getserver();
	}

}

客户端程序代码

//客户端程序
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;


public class MyTcpClient {
	private PrintWriter writer;
	private BufferedReader reader;
	Socket socket;
	public void connect(){
		System.out.println("尝试连接");
		try{
			socket = new Socket("127.0.0.1",8866);
			writer = new PrintWriter(socket.getOutputStream(),true);
			reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			System.out.println("连接成功");
			writer.println("你好,来自客户端的连接");
			getserverMessage();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	private void getserverMessage(){
		try{
			while(true){
				System.out.println(":"+ reader.readLine());				
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
			if(reader != null){
				reader.close();
			}
			if(writer != null){
				writer.close();
			}
			if(socket != null){
				socket.close();
			}
		}catch(IOException e){
			e.printStackTrace();
		}
	}
	
}

public class Main {
	public static void main(String[] args) {
		MyTcpClient tcpclient;
		tcpclient = new MyTcpClient();
		tcpclient.connect();
	}

}

服务端运行效果图

客户端运行效果图

UDP网络程序

使用UDP协议的程序流程简单很多,它收发包流程如下:

UDP网络通信的发包过程:

  1. 使用DatagramSocket()创建一个数据包套接字。
  2. 使用DatagramPacket(byte[]buf,int offset,int length,InetAddress address,int port)创建要发送的数据包。
  3. 使用DatagramSocket类的send()方法数据包。

 

UDP网络通信的收包过程:

  1. 使用DatagramSocket()创建一个数据包套接字,绑定到指定的端口。
  2. 使用DatagramPacket(byte[]buf,int length)创建字节数组来接收数据包.
  3. 使用DatagramPacket类的receive()方法接收UDP。

 

总结

网络编程是程序实现网络通信的基石,在互联网高度繁荣的当下,几乎没有什么应用不需要网络支持。网络通信基于TCP/IP,基于此,网络编程可以选择使用TCP传输或UDP传输,它们两个是比较底层的通信协议,TCP提供可靠的连接,UDP则不提供可靠的连接,在实际应用中大多数选用TCP,而UDP主要用于音视频、NTP对时这种对数据可靠性要求不是那么高的场合。

猜你喜欢

转载自blog.csdn.net/dosthing/article/details/83046052