java socket:一个简单的CS模型,帮忙找出不合适需要改进的地方=w=

问题描述

我是个对java还在学习阶段的新人,写了个比较简陋的CS通信模型,希望大家帮忙找找需要改进注意和规范的地方,最好能给个进阶的学习方向,十分感谢=w=publicclassSocketServer{publicstaticintAllThreadNum;//总线程数publicstaticvoidmain(Stringargs[]){try{ServerSocketserver=newServerSocket(9000);inttNum=0;//线程编号while(true){Socketsocket=server.accept();newThread(newTask(socket,++tNum)).start();++AllThreadNum;}}catch(IOExceptionex){ex.printStackTrace();}}staticclassTaskimplementsRunnable{privateSocketsocket;privateStudentstu;privateintThreadNum;publicTask(Socketsocket,inttn){this.socket=socket;this.ThreadNum=tn;}publicvoidrun(){try{//连接数据库Class.forName("com.mysql.jdbc.Driver");System.out.println("Thread"+ThreadNum+""+":"+"SuccessloadingMysqlDriver!");Connectionconnect=DriverManager.getConnection("jdbc:mysql://localhost:3306/firsttry","root","594278");System.out.println("Thread"+ThreadNum+""+":"+"SuccessconnectMysqlserver!");//线程正式开始服务ClientReceiveAndSend(connect);}catch(SocketExceptione){System.out.println("连接意外断开,关闭服务");return;}catch(Exceptione){e.printStackTrace();return;}}privatevoidReceiveAndSend(Connectionc)throwsException{DataInputStreamreader;reader=newDataInputStream(socket.getInputStream());while(true){if(!socket.isInputShutdown()){System.out.println("等待Client发送的消息");charhead=reader.readChar();int[]a=newint[3];a[0]=reader.readInt();a[1]=reader.readInt();a[2]=reader.readInt();System.out.println(a.toString());if(!AnalyseData(head,a)){socket.shutdownOutput();socket.shutdownInput();socket.close();System.out.println("连接已安全断开");--AllThreadNum;return;}}else{socket.close();System.out.println("close");return;}}}//分析客户端数据,处理并反馈结果privatebooleanAnalyseData(chartype,int[]data){switch(type){case'雪':System.out.println('雪');SendDataBack();break;case'白':System.out.println('白');SendDataBack();break;case'关':System.out.println("收到来自Client的关闭请求");SendDataBack();returnfalse;default:break;}returntrue;}//处理完Client的消息后回复ClientprivatevoidSendDataBack(){try{DataOutputStreamwriter=newDataOutputStream(socket.getOutputStream());charhead='B';int[]b={1,2,3};writer.writeChar(head);writer.writeInt(b[0]);writer.writeInt(b[1]);writer.writeInt(b[2]);writer.flush();}catch(IOExceptionioe){ioe.printStackTrace();}}}}

publicclassSocketClient{protectedstaticArrayListdata;privatestaticSocketsocket;privatestaticbooleanisWait;//是否在等待服务器消息反馈privatestaticbooleanisOver;//用于与等待服务器消息的线程同步关闭publicstaticvoidmain(String[]args){data=newArrayList();isWait=false;isOver=false;try{socket=newSocket("127.0.0.1",9000);DataOutputStreamwriter=newDataOutputStream(socket.getOutputStream());//创建监听消息线程WaitForMsglisten=newWaitForMsg(socket);listen.start();//发送消息循环while(true){Scannersdata=newScanner(System.in);charinputdata=sdata.nextLine().charAt(0);SendData(inputdata,writer);System.out.println("发送完成");if(inputdata=='关')//准备退出{sdata.close();break;}isWait=true;while(isWait==true){System.out.println("waiting......");}for(inti=0;i<data.size();i++){System.out.println(data.get(i));}}listen.stop();}catch(UnknownHostExceptionex){ex.getStackTrace();}catch(SocketExceptionex){System.out.println("连接发生错误");isOver=true;}catch(IOExceptionex){ex.printStackTrace();isOver=true;}}publicstaticvoidSendData(charc,DataOutputStreamwriter)throwsIOException{writer.writeChar(c);writer.writeInt(1);writer.writeInt(2);writer.writeInt(3);writer.flush();}//*******************等待服务器消息的线程************************staticclassWaitForMsgextendsThread{privatestaticSocketsocket;privatestaticDataInputStreamin;publicWaitForMsg(Socketsocket){try{this.socket=socket;in=newDataInputStream(socket.getInputStream());}catch(IOExceptionioe){//连接已关闭ioe.printStackTrace();}}publicvoidrun(){try{while(!isOver){if(in.available()>0){System.out.println("输入流可读");charhead=in.readChar();int[]rdata=newint[3];rdata[0]=in.readInt();rdata[1]=in.readInt();rdata[2]=in.readInt();data.add(head);for(inti=0;i<rdata.length;i++){data.add(rdata[i]);}isWait=false;}}}catch(IOExceptionioe){ioe.printStackTrace();return;}}}}

时间: 2024-09-20 05:36:42

java socket:一个简单的CS模型,帮忙找出不合适需要改进的地方=w=的相关文章

java 中一个简单的正则表达式问题,帮忙看下.

问题描述 哪位朋友帮忙看一下.这个正则表达式:String regex = "mailto:\w+\?";匹配下面这段内容为什么匹配不到..mailto:34553234@qq.com?cc=zhoueyese7290783@126.com&subject=applicationID:10001-action:approver&body=特别无聊. String regex = "mailto:\w+\?"; Pattern pattern = Pa

java Socket实现简单在线聊天(二)

接<java Socket实现简单在线聊天(一)>,在单客户端连接的基础上,这里第二步需要实现多客户端的连接,也就需要使用到线程.每当有一个新的客户端连接上来,服务端便需要新启动一个线程进行处理,从而解决之前的循环读取中造成阻塞的问题. 写线程通常有两种方法,集成Thread或者实现runnable接口,原则上是能实现runnable的情况下就不继承,因为实现接口的方式更加灵活. 客户端代码相较之前没有变化,变得是服务端,因此这里便只贴出服务端代码: package chat.chat; im

怎么用Java编写一个简单的登录系统?可以注册账号的那种

问题描述 怎么用Java编写一个简单的登录系统?可以注册账号的那种 数据库用的是MySQL,但Java操作方面的不知道怎么入手,求大神指点啊,有实例参考就更好了,谢谢 解决方案 import java.awt.event.*; import javax.swing.*; import java.awt.*; import java.awt.Container; import java.util.*; import java.sql.*; class Login extends JFrame im

c-我刚刚入门,写一个一元多项式的简单计算,求帮忙解决这个加减问题,代码如下,帮忙找出错误,急急急

问题描述 我刚刚入门,写一个一元多项式的简单计算,求帮忙解决这个加减问题,代码如下,帮忙找出错误,急急急 #include #include typedef struct node { float c; int e; struct node * next; }lnode,*plnode; void insert_menu(); void insert_pol(plnode &l); void output_pol(plnode &l); void add_pol(plnode list1,

求助:用java编一个简单的图书馆管理系统

问题描述 求助:用java编一个简单的图书馆管理系统不需要界面,直接在Myeclipse上运行只有四个类:图书馆,书,书的类型,读者谢谢啦! 解决方案 解决方案二:eee解决方案三:我来猜一下,lz是学生?解决方案四:我有个和LZ要的那个相似的,如果LZ想要的话发邮件给我,570369807@qq.com解决方案五:不错,继续努力解决方案六:这个可以自己动手做啊应该不难吧你这样是在学习吗?解决方案七:谢谢各位的大力帮助,我已经学会了UML建模和JAVA编写,现在看看之前的问题,觉得很幼稚,谢谢各

mfc c++-新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题

问题描述 新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题 cpp文件 // scanDlg.cpp : implementation file// #include ""stdafx.h""#include ""scan.h""#include ""scanDlg.h""#include ""afxdialogex.h&qu

c语言 树结构 二叉树-初学二叉树 运行有错误 瞅了几个小时无果 大神帮帮忙 找出错误在哪

问题描述 初学二叉树 运行有错误 瞅了几个小时无果 大神帮帮忙 找出错误在哪 ![图片说明](http://img.ask.csdn.net/upload/201503/07/1425715444_303984.png #include #include typedef struct Tree { int date; struct Tree *lson,*rson; }tree , *ztree; int a[200005]; ztree creat(ztree t,int n) { int h

java Socket实现简单在线聊天(一)

最近的项目有一个在线网页交流的需求,由于很久以前做过的demo已经忘记的差不多了,因此便重新学习一下. 我计划的大致实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首先实现第一步的简单功能,难点在于: 1.没有用过

java Socket实现简单在线聊天(三)

在上一篇,利用线程使服务端实现了能够接收多客户端请求的功能,这里便需要客户端接收多客户端消息的同时还能把消息转发到每个连接的客户端,并且客户端要能在内容显示区域显示出来,从而实现简单的在线群聊. 在实现客户端转发,无非就是增加输出流:而之前客户端都只发不收,这里也需要更改客户端达到循环接收服务端消息的目的,因此也需要实现多线程. 在实现这个功能的时候,偶然想起随机生成验证码的功能,于是也灵机一动随机给每个客户端生成一个名字,从而在输出的时候看起来更加像是群聊,不仅有消息输出,还能看到是谁. 实现