Socket协议网上介绍的有不少了,就不在多此一举了,本文主要编写一个小Demo,介绍下它具体实现java
一:Socket服务器端服务器
package com.founderit;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class HelloServer {
public static void main(String[] args) {
InputStream in = null;
OutputStream out = null;
try {
ServerSocket serverSocket= new ServerSocket(1234);
while (true){
Socket socket= serverSocket.accept();
in=socket.getInputStream();
InputStreamReader reader= new InputStreamReader(in);
StringBuilder builder=new StringBuilder();
for (int c = reader.read(); c != -1; c = reader.read()) {
builder.append((char)c);
}
System.out.println("收到的客户端请求为:-------"+builder.toString());
out=socket.getOutputStream();
out.write("请求已接收,over".getBytes());
out.flush();
socket.shutdownOutput();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
in.close();
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
二:Socket客户端
package com.founderit.controller;
import java.io.*;
import java.net.Socket;
public class SocketClient {
public static void main(String[] args) {
OutputStream out=null;
InputStream in=null;
Socket socket=null;
try {
socket=new Socket("localhost",1234);
out=socket.getOutputStream();
out.write("呼叫服务器,收到请回答".getBytes());
socket.shutdownOutput();
//获取输入流,并读取服务器端的响应信息
in=socket.getInputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(in));
StringBuilder sb=new StringBuilder();
String info=null;
while ((info=br.readLine())!=null){
sb.append(info);
}
System.out.println("收到服务端回复:"+sb.toString());
br.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
out.flush();
out.close();
in.close();
socket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
首先执行Socket服务端,它会一直运行等待接收请求,建立socketServer须要绑定端口,这个端口需须要与客户端一致
而后执行Socket客户端,它会发送Socket请求给服务端并接收服务器端反馈,运行效果以下
须要注意的是不管是客户端与服务端,执行write()方法后最好执行socket.shutdownOutput()方法关闭输出流,否则有概率写入不成功(缘由未知)多线程
----------------------------------------------------------------------------------------------------------------------我是分割线---------------------------------------------------------------------------------------------------------------------------------------------上面的Demo只是个单机版,在实际工做中不会只有一个客户端请求,下面咱们将改造Socket服务器端,使其支持多线程app
Socket服务器端socket
首先抽调具体实现,新建个具体实现类ide
package com.founderit;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Date;
public class HelloRunable implements Runnable{
Socket socket;
InputStream in = null;
OutputStream out = null;
public HelloRunable(Socket clientSocket){
this.socket=clientSocket;
}
@Override
public void run() {
try {
in=socket.getInputStream();
InputStreamReader reader= new InputStreamReader(in);
StringBuilder builder=new StringBuilder();
for (int c = reader.read(); c != -1; c = reader.read()) {
builder.append((char)c);
}
System.out.println("收到的客户端请求为:-------"+ new Date().toString()+ builder.toString());
out=socket.getOutputStream();
out.write("请求已接收,over".getBytes());
out.flush();
socket.shutdownOutput();
}catch (Exception e){
e.printStackTrace();
}finally {
try {
in.close();
out.flush();
out.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
}
接收类
package com.founderit;import java.io.*;import java.net.ServerSocket;import java.net.Socket;public class HelloServer { public static void main(String[] args) { try { ServerSocket serverSocket= new ServerSocket(1234); while (true){ Socket socket=serverSocket.accept(); new Thread(new HelloRunable(socket)).start(); } } catch (IOException e) { e.printStackTrace(); } }}改造后,Socket服务端接收到请求后,会直接开启一个新线程执行任务