[Socket编程] 用Java实现简单的服务器

运用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();
	}
}

服务端和客户端运行结果如下:
这里写图片描述

这里写图片描述

到这里,一个拥有基本功能的服务器就完成了。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值