在本程序中,客户端从命令行输入一个半径值,并传送至服务器,服务器根据这个半径值计算出圆的面积发送给客户端。客户端可以继续输入半径值得到圆的面积,直到输入了bye,结束通信。
本程序仅仅支持一个客户端的连接,一对一模式。
Client.java
package com.leo.socketcom;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
try {
//1.创建套接字,端口号为5500,连接到本机
Socket connectToServer = new Socket("localhost",5500);
//2.将输入流连接到socket上
DataInputStream inFromServer = new DataInputStream(connectToServer.getInputStream());
//3. 将输出流连接到socket上
DataOutputStream outToServer = new DataOutputStream(connectToServer.getOutputStream());
//4.输入半径数值发送到服务器,输入bye结束。
System.out.println("输入半径数值发送到服务器,输入bye结束。");
String outStr,inStr;
boolean goon = true;
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
while(goon){
outStr = buf.readLine();
//4.向服务器发送消息,消息值为半径。
outToServer.writeUTF(outStr);
//5.清空发送消息的缓冲区
outToServer.flush();
//6.接受服务器发送的消息
inStr = inFromServer.readUTF();
if(!inStr.equals("bye")){
System.out.println("从服务器返回的结果是:"+inStr);
}else
goon = false;
}
inFromServer.close();
outToServer.close();
connectToServer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Server.java
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
try{
System.out.println("等待连接");
//1.创建服务器套接字
ServerSocket serverSocket = new ServerSocket(5500);
//2.侦听来自客户端的连接请求
Socket connectFromClient = serverSocket.accept();
System.out.println("连接请求来自:"+connectFromClient.getInetAddress().getHostAddress());
DataInputStream inFromClient = new DataInputStream(connectFromClient.getInputStream());
DataOutputStream outToClient = new DataOutputStream(connectFromClient.getOutputStream());
String str;
double radius, area;
boolean goon = true;
while(goon){
//从socket中读取数据
str = inFromClient.readUTF();
if(!str.equals("bye")){
radius = Double.parseDouble(str);
System.out.println("接收到的半径值为:\t"+radius);
area = radius*radius*Math.PI;
str = Double.toString(area);
outToClient.writeUTF(str);
outToClient.flush();
System.out.println("圆的面积"+str+"已经发送");
}else{
goon = false;
outToClient.writeUTF("bye");
outToClient.flush();
}
}
inFromClient.close();
outToClient.close();
serverSocket.close();
connectFromClient.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
客户端运行图如下:
服务器端运行图如下:
从运行结果图上可以看出,在同一台PC上客户端应用和服务器应用建立的通信连接。