开篇
为什么要研究Socket?网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力[百度百科]。
实现
服务端
package com.yzz.java.socket;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* Created by yzz on 2017/10/12.
* mail:yzzstyle@163.com
*/
public class Server {
private static Server server = new Server();
private ServerSocket serverSocket;
private Server(){
try {
InetAddress address = InetAddress.getByName("192.168.1.105");
serverSocket = new ServerSocket(8087,1,address);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取服务
* @return
*/
public static Server getServer(){
return server;
}
public void readRequest(){
try {
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
int i = 0;
StringBuffer sb = new StringBuffer();
//Thread.sleep(1000);
if (reader.ready()) {
while (i != -1) {
i = reader.read();
sb.append((char) i);
}
}
System.out.println("收到客户端消息:"+sb.toString());
Thread.currentThread().sleep(500);
sendResponse(outputStream);
reader.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public void sendResponse(OutputStream outputStream){
try {
PrintWriter writer = new PrintWriter(outputStream,true);
writer.write(System.currentTimeMillis()+"yzz");
Thread.currentThread().sleep(500);
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端
package com.yzz.java.socket;
import java.io.*;
import java.net.Socket;
/**
* Created by yzz on 2017/10/12.
* mail:yzzstyle@163.com
*/
public class Client {
private int port;
private String address;
public Client(int port,String address) {
this.port = port;
this.address = address;
}
private Socket getConnection(){
try {
return new Socket(address,port);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public void sendRequest(){
try {
Socket socket = getConnection();
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream();
PrintWriter writer = new PrintWriter(outputStream,true);
writer.write(System.currentTimeMillis()+"yzz-client");
Thread.currentThread().sleep(500);
getResponse(inputStream);
writer.close();
socket.close();
Thread.currentThread().sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
public void getResponse(InputStream inputStream){
try {
boolean isOver = true;
while (isOver) {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
Thread.sleep(1000);
int i = 0;
StringBuffer sb = new StringBuffer();
if (reader.ready()) {
while (i != -1) {
i = reader.read();
sb.append((char) i);
}
}
System.out.println("收到服务端消息:"+sb.toString());
isOver = false;
Thread.currentThread().sleep(1000);
}
}catch (Exception e){
e.printStackTrace();
}
}
}
总结
这里的实现过于简单,很多问题没有考虑,当客户端连接服务器过多,就会出现java.net.ConnectException: Connection refused: connect的异常,所以我们要限制socket连接的个数。