Socket,又称为套接字,Socket是计算机网络通信的基本的技术之一。如今大多数基于网络的软件,如浏览器,即时通讯工具甚至是P2P下载都是基于Socket实现的。
服务端用ServerSocket监听指定的端口,端口号随意(1-1023的端口属于保留端口,在一些操作系统中不可以随意使用,建议使用大于1024的端口),等待客户端连接请求,客户端连接后,开始会话。
客户端用Socket对网络上某一个服务器的某一个端口发出连接请求,连接成功后,开始会话。客户端不需要指定自身的端口,只需要指定发出请求的目标地址和端口。
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class server {
public static void main(String[] args){
ServerSocket server;
Socket socket = null;
BufferedReader reader = null;
System.out.println("Server Client");
try{
// 指定服务器端的端口号为2016
server = new ServerSocket(2016);
System.out.println("Server socket created successfully.");
while (true){
System.out.println("Waiting for connection from client...");
// 建立连接
socket = server.accept();
System.out.println("Connected successfully!");
// 打开输入流socket.getInputStream() 接收客户端发来的数据
reader = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));
try {
while (true){
//输出得到的数据
System.out.println("Info from client: " + reader.readLine());
}
}catch (Exception e){
System.out.println("Client is offline.");
}finally {
try {
if (reader != null){
reader.close();
}
if (socket != null){
socket.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
客户端:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;
public class client {
public static void main(String[] args){
Socket socket = null;
OutputStreamWriter outSW = null;
BufferedWriter bw = null;
BufferedReader br = null;
String inputStr = null;
System.out.println("Socket Client");
System.out.println("Try to connect server...");
try {
//创建socket对象,指定服务器的ip地址,和服务器监听的端口号
// 客户端在new的时候,就发出了连接请求,服务器端就会进行处理
socket = new Socket("127.0.0.1", 2016);
System.out.println("Connect completed.");
//获取服务端客户端的ip和端口
InetAddress serverAddress = socket.getInetAddress();
String serverIP = serverAddress.getHostAddress();
int serverPort = socket.getPort();
InetAddress localAddress = socket.getLocalAddress();
String clientIP = localAddress.getHostAddress();
int clientPort = socket.getLocalPort();
System.out.println("Server IP: " + serverIP + ", Port: " + serverPort);
System.out.println("Client IP: " + clientIP + ", Port: " + clientPort);
System.out.println("输入字符 就会传到server 输入QUIT就会关闭client");
System.out.print("input:");
//用system.in来获取控制台中输入的字符串
br = new BufferedReader(new InputStreamReader(System.in,"UTF-8"));
while((inputStr = br.readLine()) != null) {
if(inputStr.equals("QUIT")) {
//当控制台输入QUIT的时候直接跳出循环
System.exit(0);
}
System.out.println("你输入的是: "+inputStr);
// 打开输出流socket.getOutputStream() 写入数据
outSW = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
bw = new BufferedWriter(outSW);
//write来写出数据给服务器
bw.write(inputStr);
bw.flush();
System.out.print("input:");
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
if (bw != null){
bw.close();
}
if (outSW != null){
outSW.close();
}
if (br != null){
br.close();
}
if (socket != null){
socket.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
服务端步骤:
1、new ServerSocket(2016)指定端口号
2、server.accept()建立连接
3、socket.getInputStream()接收客户端发来的信息
4、输出数据
5、关闭IO流,释放资源
6、关闭socket
客户端步骤:
1、new Socket(“127.0.0.1”, 2016)指定访问的地址和端口号
2、打开输出流socket.getOutputStream() 写入数据
3、write()写出数据给服务器,需要马上flush()
4、关闭IO流,释放资源
5、关闭socket