在 Java 中使用 Socket - 服务器






3.60/5 (10投票s)
使用 Java 创建服务器程序。
引言
在本文中,我将描述使用Sockets在Java中建立连接的步骤。 让我们开始了解通过TCP/IP创建的通信是什么... 通过TCP/IP sockets创建的通信链路是一个面向连接的链路。 这意味着服务器和客户端之间的连接在两者对话的整个过程中保持打开状态,并且仅在对话的一端正式终止交换时(通过商定的协议)才会中断(在正常情况下)。
Using the Code
- 创建一个
ServerSocket
对象ServerSocket mySock = new ServerSocket(1234);
在这里,服务器将在端口
1234
上等待(“监听”)来自客户端的连接。 - 将服务器置于等待状态
Socket link = mySock.accept();
在这里,服务器会无限期地等待(“阻塞”)客户端连接,借助
ServerSocket
类的accept
方法。当建立连接时,该类将返回一个Socket
对象。 - 设置输入和输出流。
让我们检查两个方法:Socket
类的getInputStream
和getOuputStream
。 这些方法用于获取与步骤2中返回的socket关联的流的引用。
稍后,您将使用这些流与刚刚建立连接的客户端进行通信。 如果您没有使用GUI应用程序,可以将一个Scanner
对象包装在由方法getInputStream
返回的InputStream
对象周围,以便获得面向string
的输入,让我们看看如何操作Scanner input = new Scanner(link.getInputStream());
同时,我们可以将一个
PrintWriter
对象包装在由方法getOutputStream
返回的OutputStream
对象周围。 我们在PrintWriter
构造函数中提供第二个参数true
。 此参数将导致每次调用println
时刷新输出缓冲区,让我们看看如何操作PrintWriter output = new PrintWriter(link.getOutputStream(),true);
- 发送和接收数据。
在设置了Scanner
和PrintWriter
对象之后,发送数据和接收数据就非常简单了。为此,我们必须使用nextLine
方法来接收数据,并使用println
来发送数据,让我们看看如何操作output.println("Awaiting data..."); String input = input.nextLine();
- 关闭连接(在对话完成后)
link.close();
看看这段代码
public class TCPEchoServer
{
private static ServerSocket servSock;
private static final int PORT = 1234;
public static void main(String[] args)
{
System.out.println("Opening port...\n");
try
{
servSock = new ServerSocket(PORT); //Step 1.
}
catch(IOException ioEx)
{
System.out.println("Unable to attach to port!");
System.exit(1);
}
do
{
handleClient();
}
while (true);
}
private static void handleClient()
{
Socket link = null; //Step 2.
try
{
link = servSock.accept(); //Step 2.
Scanner input = new Scanner(link.getInputStream()); //Step 3.
PrintWriter output =
new PrintWriter(link.getOutputStream(),true); //Step 3.
int numMessages = 0;
String message = input.nextLine(); //Step 4.
while (!message.equals("***CLOSE***"))
{
System.out.println("Message received.");
numMessages++;
output.println("Message " +
numMessages + ": " + message); //Step 4.
message = input.nextLine();
}
output.println(numMessages + " messages received."); //Step 4.
}
catch(IOException ioEx)
{
ioEx.printStackTrace();
}
finally
{
try
{
System.out.println( "\n* Closing connection... *");
link.close(); //Step 5.
}
catch(IOException ioEx)
{
System.out.println("Unable to disconnect!");
System.exit(1);
}
}
}
}
历史
这个例子代表了SERVER
程序。 在下一篇文章(JavaSocketsClient.aspx)中,我将描述CLIENT
程序,它几乎相同。
历史
- 2008年3月24日:初始发布