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客户端功能 就好了。
测试时,我启动了两个客户端,截图如下
所以便可验证服务端编写完成。