读书人

java Socket(2)

发布时间: 2013-12-09 09:45:50 作者: rapoo

java Socket(二)

上次做了一个java socket一对一通信的例子这次来写一个一对多的通信,这里我们使用java的多线程来实现

首先来看一下服务类

?

[java]
  • /**?
  • ?*??
  • ?*/??
  • package?com.dnion.socket;??
  • ??
  • import?java.io.IOException;??
  • import?java.net.ServerSocket;??
  • import?java.net.Socket;??
  • ??
  • /**?
  • ?***************************************************************??
  • ?*?项目名称:JavaThread?
  • ?*?程序名称:MultiJabberServer?
  • ?*?日期:2012-8-23?下午02:38:20?
  • ?*?作者:?
  • ?*?模块:?
  • ?*?描述:?
  • ?*?备注:?
  • ?*?------------------------------------------------------------?
  • ?*?修改历史?
  • ?*?序号???????????????日期??????????????修改人???????修改原因?
  • ?*??
  • ?*?修改备注:?
  • ?*?@version??
  • ?***************************************************************?
  • ?*/??
  • public?class?MultiJabberServer?{??
  • ??
  • ??????
  • ????/**?
  • ?????*?方法名:main?
  • ?????*?描述:?
  • ?????*?作者:?
  • ?????*?日期:2012-8-23?下午02:38:20?
  • ?????*?@param?@param?args?
  • ?????*?@return?void?
  • ?????*/??
  • ????public?static?void?main(String[]?args)?{??
  • ????????ServerSocket?s?=?null;??
  • ????????Socket?socket??=?null;??
  • ????????try?{??
  • ????????????s?=?new?ServerSocket(8080);??
  • ????????????//等待新请求、否则一直阻塞??
  • ????????????while(true){??
  • ????????????????socket?=?s.accept();??
  • ????????????????System.out.println("socket:"+socket);??
  • ????????????????new?ServeOneJabbr(socket);??
  • ??????????????????
  • ????????????}??
  • ????????}?catch?(Exception?e)?{??
  • ????????????try?{??
  • ????????????????socket.close();??
  • ????????????}?catch?(IOException?e1)?{??
  • ????????????????//?TODO?Auto-generated?catch?block??
  • ????????????????e1.printStackTrace();??
  • ????????????}??
  • ????????}finally{??
  • ????????????try?{??
  • ????????????????s.close();??
  • ????????????}?catch?(IOException?e)?{??
  • ????????????????//?TODO?Auto-generated?catch?block??
  • ????????????????e.printStackTrace();??
  • ????????????}??
  • ????????}??
  • ??????????
  • ??
  • ????}??
  • ??
  • }??

    ?

    接着我们要写一个服务端响应请求的类也就是一个socket

    ?

    [java]
  • /**?
  • ?*??
  • ?*/??
  • package?com.dnion.socket;??
  • ??
  • import?java.io.BufferedReader;??
  • import?java.io.BufferedWriter;??
  • import?java.io.IOException;??
  • import?java.io.InputStreamReader;??
  • import?java.io.OutputStreamWriter;??
  • import?java.io.PrintWriter;??
  • import?java.net.Socket;??
  • ??
  • /**?
  • ?***************************************************************??
  • ?*?项目名称:JavaThread?
  • ?*?程序名称:ServeOneJabbr?
  • ?*?日期:2012-8-23?下午02:34:13?
  • ?*?作者:?
  • ?*?模块:?
  • ?*?描述:?
  • ?*?备注:?
  • ?*?------------------------------------------------------------?
  • ?*?修改历史?
  • ?*?序号???????????????日期??????????????修改人???????修改原因?
  • ?*??
  • ?*?修改备注:?
  • ?*?@version??
  • ?***************************************************************?
  • ?*/??
  • public?class?ServeOneJabbr?extends?Thread{??
  • ??
  • ????private?Socket?socket?=?null;??
  • ????private?BufferedReader?br?=?null;??
  • ????private?PrintWriter?pw?=?null;??
  • ??????
  • ????public?ServeOneJabbr(Socket?s){??
  • ????????socket?=?s;??
  • ????????try?{??
  • ????????????br?=?new?BufferedReader(new?InputStreamReader(socket.getInputStream()));??
  • ????????????pw?=?new?PrintWriter(new?BufferedWriter(new?OutputStreamWriter(socket.getOutputStream())),true);??
  • ????????????start();??
  • ????????}?catch?(Exception?e)?{??
  • ??????????????
  • ????????????e.printStackTrace();??
  • ????????}??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?run()?{??
  • ????????while(true){??
  • ????????????String?str;??
  • ????????????try?{??
  • ????????????????str?=?br.readLine();??
  • ????????????????if(str.equals("END")){??
  • ????????????????????br.close();??
  • ????????????????????pw.close();??
  • ????????????????????socket.close();??
  • ????????????????????break;??
  • ????????????????}??
  • ????????????????System.out.println("Client?Socket?Message:"+str);??
  • ????????????????pw.println("Message?Received");??
  • ????????????????pw.flush();??
  • ????????????}?catch?(Exception?e)?{??
  • ????????????????try?{??
  • ????????????????????br.close();??
  • ????????????????????pw.close();??
  • ????????????????????socket.close();??
  • ????????????????}?catch?(IOException?e1)?{??
  • ????????????????????//?TODO?Auto-generated?catch?block??
  • ????????????????????e1.printStackTrace();??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??????
  • ??????
  • ??????
  • }??


    接下来利用我们上一次的客户端socket

    ?

    ?

    这样一个简单地多客户端响应socket就成了

    ?

    每次有一个请求发送过来服务端都会新建一个线程来单独服务。

  • 读书人网 >其他相关

    热点推荐