本文介紹了一種非常基本的單向客戶端和服務器設置,其中客戶端連接,將消息發送到服務器,并且服務器使用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或類似的工具,
在兩個不同的終端或選項卡上編譯它們兩者
首先運行服務器程序
然后運行客戶端程序
在客戶端窗口中鍵入消息,服務器窗口會同時接收并顯示這些消息。
鍵入結束。