Socket
前言
Socket是网络上运行的两个程序建双向通信的一端,它既可以接收请求,也可以发送请求,用它可以比较方便的在网络上传递数据,其中java中有关socket的常用方法如下:
方法名 | 功能说明 |
---|---|
public Socket(String host,int port) | 创建一个到主机host、端口为port的套接字,并连接到远程主机 |
public Socket(InetAddress host,int port) | 创建一个套接字,使用host中封装的主机信息,端口号为port,并连接到主机 |
public InetAddress getInetAddress() | 返回连接到远程主机的地址,如果连接失败则返回以前连接的主机 |
public int getPort() | 返回Socket连接到远程主机的端口号 |
public int getLocalPort() | 返回本地连接终端的端口号 |
public InputStream getInputStream() | 获取输入流,利用这个流就可以从套接字中读取数据 |
public OutputStream getOutputStream() | 获取输出流,可以在应用程序中写数据到套接字的另一端 |
public synchronized void close() | 关闭套接字 |
Socket的C\S基本过程如下:
- Server监听某个端口是否有连接请求
- Client向Server发出连接请求
- Server向Client接收消息并建立连接
- 通过getInputStream()和getOutputStream(),Server与Client双向读写
- 关闭Server和Client的Socket
Socket的基本使用流程:
- 根据指定地址和端口创建一个Socket对象
- 调用getInputStream()或getOutputStream()打开连接到Socket的输入\输出流
- 客户端与服务器根据一定的协议交互,知道关闭连接
- 关闭客户端的Socket
上一套代码参考
最基本的一套
Server:
package TestThread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server{
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
try {
serverSocket = new ServerSocket(1210);
System.out.println("Server start....");
socket = serverSocket.accept();
in =new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println("客户端传递的消息:"+in.readLine());
out=new PrintWriter(socket.getOutputStream());
out.println("服务端发送消息!");
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
in.close();
out.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
Client:
package TestThread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
PrintWriter out=null;
BufferedReader in=null;
Socket socket=null;
try {
socket = new Socket("127.0.0.1",1210);
out =new PrintWriter(socket.getOutputStream());
out.println("大家好,这里是Socket客户端");
out.flush();
in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
in.close();
out.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
多线程的Server:
package TestThread;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server2 extends Thread{
ServerSocket soc;
Server2(){
try {
soc = new ServerSocket(1210);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//启动服务器线程
this.start();
System.out.println("Server多线程接收开启....");
}
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("开启线程");
Socket socket = null;
BufferedReader in = null;
PrintWriter out = null;
while(this.isAlive()) {
try {
//接收一个套接字
socket = soc.accept();
//创建一个从套接字重读数据的管道,即输入流,读取客户信息
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
//创建一个往套接字中写数据的管道,即输出流,给客户发送返回信息
out = new PrintWriter(socket.getOutputStream());
out.println("你好,ServerSocket服务器已收到!");
out.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(in != null) {
in.close();
}
if(out != null) {
out.close();
}
if(socket != null) {
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
new Server2();
}
}
ServerSocket
一般情况下,Server的基本工作步骤如下:
- 根据指定端口创建一个新的ServerSocket对象
- 调用ServerSocket的accept()在指定端口监听到来的连接请求,accept()一直处于阻塞状态,直到有client试图建立连接,这时accept()返回连接客户端与服务端的Socket对象
- 调用getInputStream()或getOutputStream()来建立与客户端交互的输入\输出流
- 关闭服务器端的Socekt
- 返回(2)监听下一次连接