初识通信——多线程服务器的建立
前段时间悲剧的生病了,所以通信阶段的学习也就停了下来,这段时间身体见好,所以在家看了看书。虽然生病前已经写好过一个多线程服务器,但是来不及总结,整体结构也相当混乱,所以在此重新写了一遍,也算是复习一下。
package Practice1_ThreadServer;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/** * 服务器端的线程类,负责处理客户端 * @author yfr * */public class ServerThread extends Thread {private Socket client;//客户端private OutputStream ous;//输出流private InputStream ins;//输入流/** * 构造函数 * @param client :传入客户端对象 */public ServerThread(Socket client){this.client = client;try {ous = this.client.getOutputStream();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 传送消息给客户端 * @param msg: 消息 */private void sendMsg2Client(String msg){byte[] data = msg.getBytes();try {ous.write(data);ous.flush();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 读取字符串的方法 * @return 读取的字符串 * @throws Exception */private String readString() throws Exception{//获得输入流 ins = client.getInputStream();//创建字符串缓冲区StringBuffer stb = new StringBuffer();int data = 0;int EXIT = 13;//当读到回车就表示已经读到了一个字符串while(data!=EXIT){data = ins.read();stb.append((char)data);}return stb.toString().trim();}/** * 处理客户端的方法 */private void ProcessClient(){//发送欢迎消息给客户端String WelComeMsg = "你好,欢迎来到老杨的服务器\r\n";sendMsg2Client(WelComeMsg);String ClientMsg = "";String EXIT = "bye";//当读到的消息不是bye时 表明聊天还没结束while(!ClientMsg.equals(EXIT)){try {ClientMsg = readString();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}String tempMsg = "服务器收到:"+ClientMsg+"\r\n";sendMsg2Client(tempMsg);}//发送再见消息String BYBYEMsg = "期待下次光临\r\n";sendMsg2Client(BYBYEMsg);//关闭与服务器的连接try {client.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/** * 线程运行 */public void run(){ProcessClient();}}package Practice1_ThreadServer;import java.net.ServerSocket;/*** * 服务器主类 * @author yfr * */public class ServerMain {/** * 主函数 * @param args * @throws Exception */public static void main(String[] args) throws Exception {ServerMain sm = new ServerMain();sm.setUpServer(9090);}/** * 创建服务器 * @param port :端口号 * @throws Exception */private void setUpServer(int port) throws Exception{//创建服务器对象java.net.ServerSocket server = new ServerSocket(port);boolean Working = true;//服务器的工作状态while(Working){//循环等待接收客户端对象java.net.Socket client = server.accept();//创建一个线程对象ServerThread dealMachine = new ServerThread(client);//启用线程单独去处理dealMachine.start();}}}/** * 读取字符串的方法 * @return 读取的字符串 * @throws Exception */private String readString() throws Exception{//获得输入流 ins = client.getInputStream();//创建字符串缓冲区StringBuffer stb = new StringBuffer();int data = 0;int EXIT = 13;//当读到回车就表示已经读到了一个字符串while(data!=EXIT){data = ins.read();stb.append((char)data);}return stb.toString().trim();}/** * 读取字符串的方法 * @return 读取的字符串 * @throws Exception */private String readString() throws Exception{//获得输入流 ins = client.getInputStream();//创建字符串缓冲区String stb = "";int data = 0;int EXIT = 13;//当读到回车就表示已经读到了一个字符串while(data!=EXIT){data = ins.read();stb+=(char)data;}return stb.trim();}