做网络通信 JAVA开发的,主要要学习说明内容?
发布网友
发布时间:2022-04-30 01:42
我来回答
共1个回答
热心网友
时间:2022-06-28 07:12
1.IP地址与端口号
网络中的计算机若需要实现相互通信,必须为每台计算机指定标识号,通过标识号来指定接收数据和识别发送数据的计算机。TCP/IP协议中的“标识”即为IP地址。
一台计算机可同时运行多个网络程序,使用IP地址能够将数据发送到计算机,却不能保证将数据提交至哪个网络程序。因此每个被发送的网络数据包的头部都设有“端口”部分,该部分为整数,用于表示将数据帧交给哪个应用程序进行处理。同时还必须为网络程序指定端口号,使不同的应用程序接收不同端口上的数据。
同一台计算机不能存在多个使用同一端口的程序。端口数的范围在0-65535之间,其中在0-1023之间的端口号用于知名的网络服务和应用,1024以上的端口号用于普通应用程序,这样做可以避免端口号代表的网络程序串用。
2.TCP与UDP
TCP为传输控制协议,UDP为用户数据报协议。TCP是面向连接的通信协议,它提供两台计算机之间可靠无差错的数据传输。应用程序使用TCP进行通信时,数据源与目标之间将建立虚拟的连接,连接一旦建立,两台计算机之间就可以将数据作为双向字节流进行交换。
UDP是无连接的通信协议,它不保证可靠数据的传输,但能够实现向若干个目标发送数据的功能。
3.Socket简介
Socket(套接字)是网络驱动层为应用程序提供的接口和机制,其作用可以看作是为应用程序创建的港口码头。
4.TCP网络编程概述
TCP协议具体操作步骤如下:
(1)服务器程序创建ServerSocket对象,调用accept()方法等待客户端连接。
(2)客户端程序创建Socket对象与客户端建立专线连接。
(3)服务器接收客户的连接请求,并创建新的Socket对象与客户端建立专线连接。
(4)实现(2)、(3)步骤中建立连接的两个Socket在同一线程上对话。
(5)服务器重新等待新的连接请求。
5.ServerSocket类
TCP网络服务器程序的编写,需要使用ServerSocket类创建服务器。
ServerSocket类的主要方法如下:
方法 类型 描述
public ServerSocket(int port) 构造方法 创建ServerSocket实例
public Socket accept() 方法 等待客户端连接
public InetAddress getInetAddress() 方法 返回服务器的IP地址
public boolean isClosed() 方法 返回ServerSocket的关闭状态
public void close() 方法 关闭ServerSocket
服务器端每次运行时均需调用accept()方法等待客户端连接,该方法执行后服务端将进入阻塞状态,直到客户端再次连接。accept()方法的返回类型为Socket。
6.Socket类
客户端必须创建Socket对象来建立与服务器的连接,每个Socket对象代表一个客户端。
Socket类的常用方法如下:
方法 类型 描述
public Socket(String host,int port) 构造方法 创建Socket对象,同时指定要连接服务器的主机名和商品号
public InputStream getInputStream() 方法 返回套接字的输入流
public OutputStream getOutputStream() 方法 返回套接字的输出流
public boolean isClosed() 方法 返回套接字的关闭状态
public void close() 方法 关闭此Socket
注意:TCP网络编程中的信息使用输入输出流的形式传递。
7.TCP服务器程序
编写TCP服务器程序,代码如下:
package com;
import java.net.*;
import java.io.*;
public class TcpServer{
public static void main(String []a){
ServerSocket server=null;
Socket socket=null;
BufferedReader in=null;
PrintWriter out=null;
try{
//服务器在9000端口上监听
server=new ServerSocket(9000);
//接收客户端连接
socket=server.accept();
//得到客户端输入信息
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//向客户端输出信息,true是自动刷新缓冲区
out=new PrintWriter(socket.getOutputStream(),true);
out.println("已建立与服务器的连接");
String info=in.readLine();
System.out.println("客户端的输入是:"+info);
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
in.close();
out.close();
socket.close();
server.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
为验证服务器端程序能否正常工作,程序还需提供客户端程序与服务器进行通信。Windows系统中的telnet程序是一个系统自带的TCP客户端,可以使用telnet来进行与服务器端的通信测试。运行telnet时指定连接服务器的IP地址和端口号,连接一旦建立,telnet程序窗口就可以将输入内容发送至服务器,同时,可以显示从服务器接收到的数据。测试步骤如下:
(1) 运行服务器端程序
(2) 在DOS窗口中运行telnet 127.0.0.1 9000,由于服务器端程序和客户端程序在同一台机器上,所以可以使用127.0.0.1代表本机。
注:调用一次accept()方法只能接受一个连接,接受多个连接需要将该方法放在循环语句中,同时每个连接的数据的数据输入输出也应放在一个循环语句中,才能实现服务器端与客户端的持续交换。
class Service implements Runnable{
Socket socket=null;
BufferedReader in=null;
PrintWriter out=null;
public Service(Socket socket){
this.socket=socket;
}
public void run(){
//得到客户端输入信息
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//向客户端输出信息,true是自动刷新缓冲区
out=new PrintWriter(socket.getOutputStream(),true);
//循环读取客户端数据并向客户端写入数据
while(true){
out.println("已建立与服务器的连接");
System.out.println("客户端说:"+in.readLine());
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
in.close();
out.close();
socket.close();
server.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
public class TcpServer{
ServerSocket server=null;
Socket socket=null;
try{
//服务器在9000端口上监听
server=new ServerSocket(9000);
//接收多个客户端连接
while(true){
socket=server.accept();
new Thread(new Service(socket)).start();
}catch(Exception e){
e.printStackTrace();
}
}
}
8.TCP客户端程序
package com;
import java.net.*;
import java.io.*;
public class TcpClient{
public static void main(String []a){
ServerSocket server=null;
Socket socket=null;
BufferedReader in=null;
BufferedReader input=null;
PrintWriter out=null;
try{
socket=new Socket("127.0.0.1",9000);
while(true){
input=new BufferedReader(new InputStreamReader(System.in);
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
//向服务器端输出信息,true是自动刷新缓冲区
out=new PrintWriter(socket.getOutputStream(),true);
out.println("客户端说:"+input.readLine);
String info=in.readLine();
System.out.println("服务器说:"+info);
}catch(Exception e){
e.printStackTrace();
}
}
}
9.UDP网络编程
(1)DatagramSocket类主要用于实现信息的发送和接收。
DatagramSocket类的主要方法:
方法 类型 描述
public DatagramSocket() 构造方法 构造DatagramSocket对象不指定监听端口
public DatagramSocket(int port) 构造方法 构造DatagramSocket对象指定监听端口
public void send(DatagramPacket p) 方法 发送数据报
public void receive(DatagramPacket p) 方法 接收数据报
(2)DatagramPacket类
DatagramPacket类用于包装一条要发送或接收的信息,发送数据和接收数据都需要构建DatagramPacket对象。
DatagramPacket类的主要方法:
方法 类型 描述
public DatagramPacket(byte[] buf,in length) 构造方法 构造DatagramPacket对象时指定内存空间和大小
public DatagramPacket(byte[] buf,in length,InetAddress address,int port) 同上
public byte[] getData() 方法 返回接收数据
public int getLength() 方法 返回发送或接收数据的长度
public InetAddress getAddress() 方法 返回机器的地址
(3)InetAddress类
InetAddress类用于表示计算机地址,主要方法如下:
方法 类型 描述
public static InetAddress getByName(String host) 方法 通过主机名或IP地址获得一个InetAddress对象
public String getHostName() 方法 获得IP地址对应的主机名
public String getHostAddress() 方法 返回IP地址字符串
10. UDP程序设计
编写UDP网络程序需要分别编写发送程序和接收程序
(1)发送程序
package com;
import java.net.*;
public class UdpSend{
public static void main(String [] a){
DatagramSocket ds=null;
DatagramPacket dp=null;
byte[] buf=new byte[1024];
try{
//DatagramSocket类用于完成消息的发送
ds=new DatagramSocket();
String info="hello world";
dp=new DatagramPacket(info.getBytes(),info.length,InetAddress.getByName("localhost"),3000);
//发送数据包
ds.send(dp);
}catch(Exception e){
e.printStackTrace();
}
finally
{
ds.close(); //消息发送完毕,关闭对象
}
}
}
(2)接收程序
package com;
import java.net.*;
public class UdpRecv{
public static void main(String [] a){
DatagramSocket ds=null;
DatagramPacket dp=null;
byte[] buf=new byte[1024];
try{
//DatagramSocket类用于完成消息的发送
ds=new DatagramSocket();
dp=new DatagramPacket(buf,1024);
//接收发送方发送的数据
ds.receive(dp);
String str=new String(dp.getData(),0,dp.getLength());
str=str+" from "+dp.getAddress.getHostAddress();
System.out.println(str);
}catch(Exception e){
e.printStackTrace();
}
finally
{
ds.close(); //消息发送完毕,关闭对象
}
}
}