Socket简单Demo

Posted lovetq520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket简单Demo相关的知识,希望对你有一定的参考价值。

Socket协议网上介绍的有很多了,就不在画蛇添足了,本文主要编写一个小Demo,介绍下它具体实现

一: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服务器端,使其支持多线程

Socket服务器端

首先抽调具体实现,新建个具体实现类

技术图片

 

 

 

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服务端接收到请求后,会直接开启一个新线程执行任务



以上是关于Socket简单Demo的主要内容,如果未能解决你的问题,请参考以下文章

服务器端简单Demo

golang代码片段(摘抄)

windows下对socket的send和recv的超时设置,并附一个简洁明了的socket简单demo

简单的通信----使用Socket实现TCP协议

简单的通信----使用Socket实现TCP协议

多线程+socket实现多人聊天室