package com.ct.server; import java.net.ServerSocket; import java.net.Socket; /** * @author Chalmers * @version 创建时间:2015年12月14日 下午7:14:14 */ /** * 网络通信服务端,运行程序,等待客户端的连接 */ /** * 在服务端中,只需要指定端口,表示该端口已经被该程序占用 而不需要写网址,因为服务端在此电脑上,可以通过电脑ip和服务端端口来连接该程序 */ public class MyServer { public static void main(String[] args) { ServerSocket server = null; Socket socket = null; try { // 建立一个ServerSocket对象 // 数字表示服务端占用的端口 // 端口范围为0~65535 /* *创建服务器对象的时候是不需要使用地址的,这个与客户端对象的创建不同。 */ server = new ServerSocket(9090); while (true) { System.out.println("服务器已经启动,在9090端口正在等待连接~~~"); // 开始等待客户端的连接 // 如果有客户端连上,就会接收到客户端套接字对象 // 如果没有,则等待 socket = server.accept(); //线程,可以用多个客户端连接服务端 ClientThread ct = new ClientThread(socket); ct.start(); } } catch (Exception e) { e.printStackTrace(); } } }
?
?
?
?
?
?
package com.ct.server; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.SocketAddress; /** * @author Chalmers * @version 创建时间:2015年12月14日 下午8:49:32 */ public class ClientThread extends Thread { private Socket socket; //服务器 public ClientThread(Socket socket) { this.socket = socket; } @Override public void run() { super.run(); try { // 获得远程客户端地址 // 如果此行代码在服务端写,则获得客户端地址 // 如果在客户端写,则获得服务端地址 SocketAddress addr = socket.getRemoteSocketAddress(); // 获取本地服务器地址 // 与上面相反 // SocketAddress addr2 = socket.getLocalSocketAddress(); System.out.println("连上一个客户端: " + addr); // System.out.println("客户端: " + addr2); // 通过socket对象获得输出流 OutputStream os = socket.getOutputStream(); // 包装成字符流 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os)); // 向客户端写数据 String msg = "Hello Boy!\n"; bw.write(msg); //注意要写 bw.flush(); // 通过socket获得输入流 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); while (true) { // 读取一行数据 msg = br.readLine(); //写这个是想让服务端正常退出 // if (msg == null) { // break; // } System.out.println("客户端发送的数据: " + msg); } } catch (Exception e) { e.printStackTrace(); } } }
?
?
?
因为要测试多个客户端的连接,所以用了线程。
?
?
服务端写好了,但没写客户端,该如何验证呢??
可以用下面的方法:
启动cmd后,输入?telnet?127.0.0.1?9090(你设置的服务端的端口号)。
如果telnet不能打开怎么办??
我的是win8系统,所以就讲解win8的做法,其他操作系统也差不太多。
我的电脑-->属性-->控制面板主页-->程序和功能-->启用或关闭windows功能-->选择开启Telnet客户端功能???就好了。
?
测试时,我启动了两个客户端,截图如下
?
?
所以便可验证服务端编写完成。
?
?
?
原文:http://moonmonster.iteye.com/blog/2264895