Socket 通常被称作“套接字”,用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端成为一个socket。
建立网络通信连接至少需要一个端口(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程;好比,HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
Socket通信实现概要:
服务端使用Eclipse编写程序并开启后,使用Linux做客户端,通过【telnet工具+服务端IP地址+端口号】进行连接通信。
微观实现是这样的:Client 端--->A Stream--->Socket--->A Stream--->Server端
Socket 获取Client 端的输入流,再输出给Server端。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.BreakIterator;
import java.util.Scanner;
public class ServerSide {
public static void main(String[] args) {
Server();
}
/**
* 功能:
* 1、接受Client端发来的请求
* 2、传递Socket对象给线程
*/
public static void Server(){
try {
//打开并监听6666端口
ServerSocket serverSocket = new ServerSocket(6666);
while(true){
//接受一个客户端
Socket socket = serverSocket.accept();
System.out.println("***客户端连接者:"+socket.getInetAddress()+"***");
//分配一条线程给客户端,并开启线程
new ThreadSocket(socket).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 功能:
* 1、当Client端连接Server端时,自动发送欢迎语
* 2、根据Client输入内容,自动回复相应内容
* 3、
*
*/
class ThreadSocket extends Thread{
Socket socket = null;
public ThreadSocket(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
//获取Socket输出流,输出欢迎语
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.println("Hello,周末愉快!很高兴为你效劳!(输入Exit结束对话)");
pw.flush();
//循环接收Client输入流
InputStream is = socket.getInputStream();
Scanner scanner = new Scanner(is);
while (scanner.hasNextLine()) {
String client_msg = scanner.nextLine();
String returnMsg = getReturnMsg(client_msg,pw);
pw.println(returnMsg);
pw.flush();
}
os.close();
is.close();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private String getReturnMsg(String client_msg,PrintWriter pw) {
String answer = "";
if (client_msg.contains("在吗")) {
answer = "您好~ 欢迎光临本小店,请问您看中哪些宝贝?我可以帮你介绍一下~ ";
}else if (client_msg.contains("发货")) {
answer = "亲~ 付款后我们尽量当天填写快递单,然后按照先后顺序发货,所以承诺72小时内发货,发货后外省3-5天左右收到,山东省内是次日到达~";
}else if (client_msg.contains("正品")) {
answer = "所有商品都是专柜正品,质量没有问题,而且小店已加入假一赔三、七日无条件退换等服务,所以亲尽可放心购买!";
}else if (client_msg.equalsIgnoreCase("exit")) {
System.exit(0);
}else{
answer = "亲,能把问题描述清楚些吗?";
}
return answer;
}
}
运行java程序启动服务器,查看服务端IP地址:
使用Client 端连接Server端:
【telnet+服务端IP地址+端口号】
#telnet 192.168.20.53 6666
服务端控制台可查看客户端连接数: