Socket_TCP 服务端编写

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客户端功能   就好了。

 

测试时,我启动了两个客户端,截图如下

 


 

所以便可验证服务端编写完成。

 

 


 

猜你喜欢

转载自moonmonster.iteye.com/blog/2264895