本文介绍了一种非常基本的单向客户端和服务器设置,其中客户端连接,将消息发送到服务器,并且服务器使用Socket连接显示消息。要使这些功能正常工作,需要进行很多底层操作,但是JAVA API网络软件包(java.net)会处理所有这些工作,从而使程序员的网络编程变得非常容易。
建立Socket连接
要连接到其他机器,我们需要一个Socket连接。Socket连接意味着两台机器具有有关彼此的网络位置(IP地址)和TCP端口的信息。java.net.Socket类表示一个Socket。打开socket:
Socket socket = new Socket(“127.0.0.1”, 5000)
第一个参数– 服务器的IP地址。(127.0.0.1是本地主机的IP地址,其中代码将在单个独立计算机上运行)。
第二个参数– TCP端口。(只是一个数字,表示要在服务器上运行哪个应用程序。例如,HTTP在端口80上运行。端口号可以从0到65535)
通讯
为了通过Socket连接进行通信,流被用于输入和输出数据。
断开连接
发送到服务器的消息后,Socket连接将明确关闭。
在程序中,客户端不断读取用户的输入并将其发送到服务器,直到键入“ Over”为止。
Java实现
// A Java program for a Client
import java.net.*;
import java.io.*;
public class Client
{
// initialize socket and input output streams
private Socket socket = null;
private DataInputStream input = null;
private DataOutputStream out = null;
// constructor to put ip address and port
public Client(String address, int port)
{
// establish a connection
try
{
socket = new Socket(address, port);
System.out.println("Connected");
// takes input from terminal
input = new DataInputStream(System.in);
// sends output to the socket
out = new DataOutputStream(socket.getOutputStream());
}
catch(UnknownHostException u)
{
System.out.println(u);
}
catch(IOException i)
{
System.out.println(i);
}
// string to read message from input
String line = "";
// keep reading until "Over" is input
while (!line.equals("Over"))
{
try
{
line = input.readLine();
out.writeUTF(line);
}
catch(IOException i)
{
System.out.println(i);
}
}
// close the connection
try
{
input.close();
out.close();
socket.close();
}
catch(IOException i)
{
System.out.println(i);
}
}
public static void main(String args[])
{
Client client = new Client("127.0.0.1", 5000);
}
}
建立Socket连接
要编写服务器应用程序,需要两个Socket。
等待客户端请求的ServerSocket(客户端创建新的Socket()时)
一个普通的旧SocketSocket,用于与客户端进行通信。
通讯
getOutputStream()方法用于通过Socket发送输出。
关闭连接
完成后,重要的是通过关闭Socket以及输入/输出流来关闭连接。
// A Java program for a Server
import java.net.*;
import java.io.*;
public class Server
{
//initialize socket and input stream
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
// constructor with port
public Server(int port)
{
// starts server and waits for a connection
try
{
server = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Waiting for a client ...");
socket = server.accept();
System.out.println("Client accepted");
// takes input from the client socket
in = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
String line = "";
// reads message from client until "Over" is sent
while (!line.equals("Over"))
{
try
{
line = in.readUTF();
System.out.println(line);
}
catch(IOException i)
{
System.out.println(i);
}
}
System.out.println("Closing connection");
// close connection
socket.close();
in.close();
}
catch(IOException i)
{
System.out.println(i);
}
}
public static void main(String args[])
{
Server server = new Server(5000);
}
}
重要事项
服务器应用程序在特定的端口5000上创建一个ServerSocket。这将启动我们的服务器,以侦听端口5000传入的客户端请求。
然后,服务器创建一个新的Socket以与客户端进行通信。
socket = server.accept()
accept()方法会阻塞(只是坐在那里),直到客户端连接到服务器为止。
然后,我们使用getInputStream()方法从Socket获取输入。我们的服务器一直在接收消息,直到客户端发送“结束”为止。
完成后,我们通过关闭Socket和输入流来关闭连接。
要在计算机上运行客户端和服务器应用程序,请同时编译它们。然后,首先运行服务器应用程序,然后运行客户端应用程序。
在终端或命令提示符上运行
打开两个窗口,一个用在服务器,另一个用在客户端
1.首先以方式运行Server应用程序
$ java Server
服务器开始
等待客户端…
2.然后,在另一个终端上运行客户端应用程序,如下所示:
$ java Client
它将显示–已连接,并且服务器接受客户端并显示
3.然后,您可以开始在“客户端”窗口中键入消息。这是给客户的样本输入
Hello
I made my first socket connection
Over
服务器同时接收并显示的内容,
Hello
I made my first socket connection
Over
Closing connection
请注意,发送“ Over”将关闭客户端和服务器之间的连接,就像之前所说的那样。
如果您使用的是Eclipse或类似的工具,
在两个不同的终端或选项卡上编译它们两者
首先运行服务器程序
然后运行客户端程序
在客户端窗口中键入消息,服务器窗口会同时接收并显示这些消息。
键入结束。