创建两个java类,Server.java和Client.java。
Client.java代码:
package main;
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
// TODO code application logic here
try{
Socket connectToServer=new Socket("localhost",5500);//连接到本机,端口号5500
DataInputStream inFromServer=new DataInputStream(
connectToServer.getInputStream());//将数据输入流连接到socket上
DataOutputStream outToServer=new DataOutputStream(
connectToServer.getOutputStream());//将数据输出流连接到socket上
System.out.println("输入半径数值发送到服务器,输入bye结束。");
String outStr,inStr;
boolean goon=true;
BufferedReader buf=new BufferedReader(
new InputStreamReader(System.in));//将用户输入的数据保存在buf中
while(goon){
outStr=buf.readLine();//读入用户的输入
outToServer.writeUTF(outStr);//写到已经连接socket的数据输出流中
outToServer.flush();//flush()表示强制将缓冲区中的数据发送出去,不必等到缓冲区满.
inStr=inFromServer.readUTF();//从已经连接socket的数据输入流中读数据(就是说读服务器返回的数据)
if(!inStr.equals("bye"))//如果返回的不是bye,就输出返回的数据
System.out.println("从服务器返回的结果是"+inStr);
else //否则结束客户端的输入
goon=false;
}
inFromServer.close(); //关闭输入流
outToServer.close(); //关闭输出流
connectToServer.close();//关闭socket
}catch(IOException e){
e.printStackTrace();
}
}
}
Server.java代码:
package main;
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args){
try{
System.out.println("等待连接");
ServerSocket serverSocket=new ServerSocket(5500);//服务端创建监听端口的ServerSocket
Socket connectToClient=serverSocket.accept();
//ServerSocket对象调用accept()方法在指定的端口监听到来的连接。accept()一直处于阻塞状态,直到有客户端试图建 //立连接。这时accept()方法返回连接客户端与服务器的Socket对象
System.out.println("连接请求来自"+
connectToClient.getInetAddress().getHostAddress());//获得套接字连接的地址
DataInputStream inFromClient=new DataInputStream(
connectToClient.getInputStream());//获得套接字所用的输入流
DataOutputStream outToClient=new DataOutputStream(
connectToClient.getOutputStream());//获得套接字所用的输出流
String str;
double radius,area;
boolean goon=true;
while(goon){
str=inFromClient.readUTF();
if(!str.equals("bye")){
radius=Double.parseDouble(str);//字符串封装为double型
System.out.println("接收到的半径值为:"+radius);
area=radius*radius*Math.PI;
str=Double.toString(area);//double封装为字符串类型
outToClient.writeUTF(str);
outToClient.flush();
System.out.println("圆面积"+str+"已经发送");
}else{
goon=false;
outToClient.writeUTF("bye");
outToClient.flush();
}
}
inFromClient.close();
outToClient.close();
serverSocket.close();
}catch(IOException e){
e.printStackTrace();
}
}
}
运行结果:
先运行Server.java,右键运行文件,
再运行Client.java,
可见连接成功。
在客户端输入2,
从服务器返回结果成功。
注:
1、
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
上面可以写成:
InputStream input = System.in;
BufferedReader buf = new BufferedReader(new InputStreamReader(input));
2、
connectToClient.getInetAddress().getHostAddress();
socket.getInetAddress()返回InetAddress对象包含远程计算机的IP地址。InetAddress.getHostAddress()返回String对象与该地址的文本表示。可以写成:
InetAddress addr = socket.getInetAddress();
String remoteIp = addr.getHostAddress();
总结
Socket是网络驱动层提供给应用程序的接口和一种机制,能执行7种基本操作:
(1)连接到远程机器
(2)绑定到端口
(3)接收从远程极其来的绑定端口上的连接
(4)监听到达的数据
(5)发送数据
(6)接收数据
(7)关闭连接