Socket简单Demo

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服务端接收到请求后,会直接开启一个新线程执行任务
相关文章
相关标签/搜索