运用Socket技术,实现一个简单的服务器。 下面是代码:
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args) throws IOException {
//监听的端口
final int port = 6666;
//服务端(绑定端口)
ServerSocket server = new ServerSocket(port);
System.out.println("Server正在运行");
while(true) {
//等待客户端连接
Socket socket = server.accept();
//连接建立之后的操作
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("来息客户端的消息: " + sb.toString());
inputStream.close();
socket.close();
}
}
}
运行结果:
客户端代码:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class SocketClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//设置Url和端口, 127.0.0.1代表本机
String url = "127.0.0.1";
int port = 6666;
//与服务端建立连接
Socket socket = new Socket(url,port);
System.out.println("已经连接到服务端");
//建立连接后输出流到服务端
OutputStream outputStream = socket.getOutputStream();
String message = "Hello,666";
outputStream.write(message.getBytes("UTF-8"));
outputStream.close();
socket.close();
}
}
运行结果:
服务端控制台:
服务端成功接收到来自客户端的消息
注意:127.0.0.1代表本机地址,服务端与客户端的编码格式要一致(上面代码统一为UTF-8),否则会出现乱码。
至此,一个最简单的服务器就完成了,但我们并不会就此满足!
我们要把简单服务器升级成一个可以返回消息的服务器。
问题:客户端打开一个输出流后,如果之前没有约定,也没有关闭它,那么服务端永远不知道客户端是否发送完消息,那么服务端会一直等待下去,直到读取超时,非常影响服务器的性能。
解决方案:调用Socket的shutdownOutput()方法,底层会告知服务端我这边已经写完了,那么服务端收到消息后,就能知道已经读取完消息,如果服务端有要返回给客户的消息那么就可以通过服务端的输出流发送给客户端,如果没有,直接关闭Socket。
关于shutdownOutput()方法和close()方法的区别,可以参考:http://blog.csdn.net/mafuli007/article/details/7544373
服务端多了一段返回信息的代码,如下:
public class SocketServer {
public static void main(String[] args) throws IOException {
//监听的端口
final int port = 6666;
//服务端(绑定端口)
@SuppressWarnings("resource")
ServerSocket server = new ServerSocket(port);
System.out.println("Server正在运行");
while(true) {
//等待客户端连接
Socket socket = server.accept();
//连接建立之后的操作
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while((len = inputStream.read(bytes)) != -1) {
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("来息客户端的消息: " + sb.toString());
//返回消息给客户端
OutputStream outputStream = socket.getOutputStream();
outputStream.write("服务器已收到消息!".getBytes("UTF-8"));
inputStream.close();
socket.close();
}
}
}
客户端则多了接受信息和告知服务器已发送完毕的代码,如下:
public class SocketClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//设置Url和端口, 127.0.0.1代表本机
String url = "127.0.0.1";
int port = 6666;
//与服务端建立连接
Socket socket = new Socket(url,port);
System.out.println("已经连接到服务端");
//建立连接后输出流到服务端
OutputStream outputStream = socket.getOutputStream();
String message = "Hello,666";
outputStream.write(message.getBytes("UTF-8"));
//告诉服务器已发送完毕
socket.shutdownOutput();
//接受服务器返回的消息
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024];
int len;
StringBuilder sb = new StringBuilder();
while ((len = inputStream.read(bytes)) != -1) {
//注意指定编码格式,发送方和接收方一定要统一,建议使用UTF-8
sb.append(new String(bytes, 0, len,"UTF-8"));
}
System.out.println("来自服务器的消息: " + sb);
inputStream.close();
outputStream.close();
socket.close();
}
}
服务端和客户端运行结果如下:
到这里,一个拥有基本功能的服务器就完成了。