大家好,欢迎来到IT知识分享网。
前言
计算机网路实现了多个网络终端的互联,彼此之间能够进行数据交流。而网络应用程序就是在已连接的不同终端设备上运行的程序,这些网络程序相互之间可以进行数据交互。网络程序的数据交互则依赖于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网络通信的发包过程:
- 使用DatagramSocket()创建一个数据包套接字。
- 使用DatagramPacket(byte[]buf,int offset,int length,InetAddress address,int port)创建要发送的数据包。
- 使用DatagramSocket类的send()方法数据包。
UDP网络通信的收包过程:
- 使用DatagramSocket()创建一个数据包套接字,绑定到指定的端口。
- 使用DatagramPacket(byte[]buf,int length)创建字节数组来接收数据包.
- 使用DatagramPacket类的receive()方法接收UDP。
总结
网络编程是程序实现网络通信的基石,在互联网高度繁荣的当下,几乎没有什么应用不需要网络支持。网络通信基于TCP/IP,基于此,网络编程可以选择使用TCP传输或UDP传输,它们两个是比较底层的通信协议,TCP提供可靠的连接,UDP则不提供可靠的连接,在实际应用中大多数选用TCP,而UDP主要用于音视频、NTP对时这种对数据可靠性要求不是那么高的场合。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23882.html