Java Socket基础
较基础的Java Socket通信样例!
一、长连接通信
客户端和服务端建立通道后,Socket一直开着。两端通过read()等待消息。
1)简易聊天
服务端可主动对各个客户端发送消息,而各客户端只能单独发送给服务端。当然,只要你愿意,在服务端改下,即可转发了。
附件解压工程ChatSocket,运行TestServer、TestClient即可。src下还有两批处理,详细看TestServer文件内注释了。
1.1)ChatServer.java
- publicclassChatServerextendsThread{
- privateintport;
- privateServerSocketmServerSocket;
- privateExecutorServicepool;
- privateArrayList<Socket>mClientList;
- publicChatServer(intport){
- this.port=port;
- pool=Executors.newCachedThreadPool();
- mClientList=newArrayList<Socket>();
- }
- @Override
- publicvoidrun(){
- try{
- mServerSocket=newServerSocket(port);
- Socketclient=null;
- while(true){
- client=mServerSocket.accept();
- mClientList.add(client);
- System.out.println(client.getInetAddress()+"建立了连接");
- pool.execute(newThreadServer(client));
- }
- }catch(BindExceptione){
- System.out.println("端口使用中,请关闭后重开!");
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- privateclassThreadServerextendsThread{
- privateSocketclient;
- publicThreadServer(Socketclient){
- this.client=client;
- }
- @Override
- publicvoidrun(){
- DataInputStreamin=null;
- DataOutputStreamout=null;
- try{
- in=newDataInputStream(client.getInputStream());
- out=newDataOutputStream(client.getOutputStream());
- BufferedReaderwt=newBufferedReader(newInputStreamReader(
- System.in));
- while(true){
- if(in.available()>0){
- Stringstr=in.readUTF();
- System.out.println(str);
- if(null==str||"end".equals(str)){
- System.out
- .println(client.getInetAddress()+"正常退出");
- break;
- }
- }else{
- if(wt.ready()){
- Stringstr=wt.readLine();
- sendMessage(str);
- }else{
- try{
- client.sendUrgentData(0xFF);
- Thread.sleep(100);
- }catch(Exceptione){
- System.out.println(client.getInetAddress()
- +"断开连接");
- break;
- }
- }
- }
- }
- }catch(SocketExceptione){
- System.out.println(client.getInetAddress()+"异常退出");
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- mClientList.remove(client);
- try{
- if(null!=in){
- in.close();
- }
- if(null!=out){
- out.close();
- }
- if(null!=client){
- client.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- }
- publicvoidsendMessage(Stringmsg)throwsIOException{
- DataOutputStreamout=null;
- for(Socketclient:mClientList){
- out=newDataOutputStream(client.getOutputStream());
- out.writeUTF(msg);
- out.flush();
- }
- }
- }
1.2)ChatClient.java
- publicclassChatClientextendsThread{
- privateSocketAddressaddress;
- privateinttimeout;
- publicChatClient(Stringhost,intport,inttimeout){
- this.address=newInetSocketAddress(host,port);
- this.timeout=timeout;
- }
- @Override
- publicvoidrun(){
- Socketsocket=newSocket();
- try{
- socket.connect(address,timeout);
- handleSocket(socket);
- }catch(ConnectExceptione){
- System.out.println("连接不上服务器");
- }catch(SocketTimeoutExceptione){
- System.out.println("连接服务器超时");
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=socket){
- socket.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- privatevoidhandleSocket(Socketsocket){
- DataInputStreamin=null;
- DataOutputStreamout=null;
- try{
- in=newDataInputStream(socket.getInputStream());
- out=newDataOutputStream(socket.getOutputStream());
- BufferedReaderwt=newBufferedReader(newInputStreamReader(
- System.in));
- while(true){
- if(wt.ready()){
- Stringstr=wt.readLine();
- out.writeUTF(str);
- out.flush();
- if(str.equals("end")){
- break;
- }
- }else{
- try{
- socket.sendUrgentData(0xFF);
- Thread.sleep(100);
- }catch(Exceptione){
- System.out.println("服务器断开连接");
- break;
- }
- }
- if(in.available()>0)
- System.out.println(in.readUTF());
- }
- }catch(SocketExceptione){
- System.out.println("服务器异常");
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=in){
- in.close();
- }
- if(null!=out){
- out.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- }
2)对象消息
发送对象消息。服务端有LinkServer和LinkServer2两个,分别支持单客户端与多客户端,方式也有些不一样。
附件解压工程LinkedSocketB,.test包内Test开头的即是测试类了。服务端接收到客户端连接时,直接一个循环发送n个对象过去,没什么大问题^^。
2.1)LinkClient.java
- publicclassLinkClientextendsThread{
- privateSocketAddressaddress;
- privateinttimeout;
- privateOnLinkClientListenerlistener;
- publicLinkClient(Stringhost,intport,inttimeout){
- this.address=newInetSocketAddress(host,port);
- this.timeout=timeout;
- }
- @Override
- publicvoidrun(){
- Socketsocket=newSocket();
- try{
- socket.connect(address,timeout);
- if(null!=listener){
- listener.onConnected();
- }
- receiveObj(socket);
- }catch(ConnectExceptione){
- if(null!=listener){
- listener.onConnectException();
- }
- }catch(SocketTimeoutExceptione){
- if(null!=listener){
- listener.onTimeoutException();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=socket){
- socket.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- privatevoidreceiveObj(Socketsocket){
- ObjectInputStreamis=null;
- try{
- is=newObjectInputStream(newBufferedInputStream(
- socket.getInputStream()));
- while(true){
- Objectobj=is.readObject();
- if(null==obj){
- break;
- }
- if(null!=listener){
- listener.onReceive(obj);
- }
- }
- if(null!=listener){
- listener.onExited();
- }
- }catch(SocketExceptione){
- if(null!=listener){
- listener.onSocketException();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }catch(ClassNotFoundExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=is){
- is.close();
- }
- if(null!=socket){
- socket.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- publicvoidsetOnLinkClientListener(OnLinkClientListenerlistener){
- this.listener=listener;
- }
- }
2.2)LinkServer.java
- publicclassLinkServerextendsThread{
- privateintport;
- privateServerSocketmServerSocket;
- privateExecutorServicepool;
- privateOnLinkServerListenerlistener;
- privateObjectlockObj=newObject();
- privatebooleanisWaiting=false;
- privateArrayList<Object>sendObjList;
- publicLinkServer(intport){
- this.port=port;
- pool=Executors.newCachedThreadPool();
- sendObjList=newArrayList<Object>();
- }
- @Override
- publicvoidrun(){
- try{
- mServerSocket=newServerSocket(port);
- Socketclient=null;
- client=mServerSocket.accept();
- if(null!=listener){
- listener.onClientConnected(client.getInetAddress());
- }
- pool.execute(newThreadServer(client));
- }catch(BindExceptione){
- if(null!=listener){
- listener.onBindException();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- privateclassThreadServerextendsThread{
- privateSocketclient;
- publicThreadServer(Socketclient){
- this.client=client;
- }
- @Override
- publicvoidrun(){
- ObjectOutputStreamos=null;
- try{
- os=newObjectOutputStream(client.getOutputStream());
- ObjectsendObj;
- synchronized(lockObj){
- while(true){
- if(sendObjList.size()<=0){
- isWaiting=true;
- lockObj.wait();
- }
- sendObj=sendObjList.get(0);
- os.writeObject(sendObj);
- os.flush();
- if(null==sendObj){
- if(null!=listener){
- listener.onExited(client.getInetAddress());
- }
- break;
- }
- sendObjList.remove(0);
- }
- }
- }catch(SocketExceptione){
- if(null!=listener){
- listener.onSocketException(client.getInetAddress());
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }catch(InterruptedExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=os){
- os.close();
- }
- if(null!=client){
- client.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- }
- publicvoidsendObj(Objectobj){
- if(null!=obj&&!isSerializable(obj))
- thrownewIllegalArgumentException(
- "Objectneedstoimplementjava.io.Serializable!");
- sendObjList.add(obj);
- if(isWaiting){
- synchronized(lockObj){
- lockObj.notifyAll();
- }
- isWaiting=false;
- }
- }
- privatebooleanisSerializable(Objectobj){
- Class<?>[]cls=obj.getClass().getInterfaces();
- for(Class<?>clazz:cls){
- if(clazz.getName().equals(Serializable.class.getName()))
- returntrue;
- }
- returnfalse;
- }
- publicvoidsetOnLinkServerListener(OnLinkServerListenerlistener){
- this.listener=listener;
- }
- }
二、短连接通信
客户端请求一次,建立一次Socket,完成后即可关闭。服务端通过accept()等待。
1)对象消息
客户端发送对象,服务端接受对象,很简单的例子。
1.1)EasyClient.java
- publicclassEasyClient{
- privateSocketAddressaddress;
- privateinttimeout;
- privateOnClientListenerlistener;
- publicEasyClient(Stringhost,intport,inttimeout){
- this.address=newInetSocketAddress(host,port);
- this.timeout=timeout;
- }
- publicbooleansendMessage(Objectobj){
- booleanresult=false;
- Socketsocket=null;
- try{
- socket=newSocket();
- socket.connect(address,timeout);
- if(null!=listener){
- listener.onConnected();
- }
- result=sendMessage(socket,obj);
- }catch(ConnectExceptione){
- if(null!=listener){
- listener.onConnectException();
- }
- }catch(SocketTimeoutExceptione){
- if(null!=listener){
- listener.onTimeoutException();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=socket){
- socket.close();
- socket=null;
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- returnresult;
- }
- privatebooleansendMessage(Socketsocket,Objectobj){
- booleanresult=false;
- ObjectOutputStreamos=null;
- try{
- os=newObjectOutputStream(socket.getOutputStream());
- os.writeObject(obj);
- os.flush();
- if(null!=listener){
- listener.onMessageSent(obj);
- }
- result=true;
- }catch(SocketExceptione){
- if(null!=listener){
- listener.onSocketException();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=os){
- os.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- returnresult;
- }
- publicvoidsetOnClientListener(OnClientListenerlistener){
- this.listener=listener;
- }
- }
1.2)EasyServer.java
- publicclassEasyServerextendsThread{
- privateintport;
- privateServerSocketmServerSocket;
- privateOnServerListenerlistener;
- publicEasyServer(intport){
- this.port=port;
- }
- @Override
- publicvoidrun(){
- try{
- mServerSocket=newServerSocket(port);
- Socketsocket=null;
- while(true){
- socket=mServerSocket.accept();
- receiveMessage(socket);
- }
- }catch(BindExceptione){
- if(null!=listener){
- listener.onBindException();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- privatevoidreceiveMessage(Socketsocket){
- ObjectInputStreamis=null;
- try{
- is=newObjectInputStream(newBufferedInputStream(
- socket.getInputStream()));
- Objectobj=is.readObject();
- if(null!=listener){
- listener.onReceive(socket.getInetAddress(),obj);
- }
- }catch(SocketExceptione){
- if(null!=listener){
- listener.onSocketException(socket.getInetAddress());
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }catch(ClassNotFoundExceptione){
- e.printStackTrace();
- }finally{
- try{
- if(null!=is){
- is.close();
- }
- if(null!=socket){
- socket.close();
- }
- }catch(IOExceptione){
- e.printStackTrace();
- }
- }
- }
- publicvoidsetOnServerListener(OnServerListenerlistener){
- this.listener=listener;
- }
- }
三、后记
恩,哦,socket还有个比较常用的是setSoTimeout(),在read()阻塞超时会报SocketTimeoutException,catch住处理即可。
更多的如SSLSocket、NIO的简单例子,可以先
Click here!这个整理好的样例工程就不提供了,自己动手^^!
ps:老遇到8W冗余字符,拆着拆着就三个了==!
出处http://vaero.blog.51cto.com/4350852/893847
分享到:
相关推荐
JAVA Socket教程 Java网络编程之传输控制协议 Socket套接字—Java套接字编程
可以学习下!关于socket 这项技术,很多项目都应用到,掌握了解对你一定有一定的益处!
socket的TCP与UDP编程示例
一篇讲Java Socket套接字的小文章,不过里面讲的还不错。对于像学习Java Socket基础的人来说可以下载看看,我也顺便挣点分。 :)
java socket 简单成绩管理系统 适合有一定JAVA编程基础及socket相关知识的初学者
Java课程设计Java Socket实现聊天室源码内含项目说明.zipJava课程设计Java Socket实现聊天室源码内含项目说明.zipJava课程设计Java Socket实现聊天室源码内含项目说明.zipJava课程设计Java Socket实现聊天室源码内含...
很不错的java学习内容!!!三步学会Java_Socket,有心人请学习!!!
最基础的java socket通信,客户端服务端之间传送javabean对象
1.3 Java socket - 套接字基础 . . . . . 6 1.4 Java socket - 一个秘密的套接字 . . . . . 11 1.5 Java socket - 一个简单示例 . . . . . . . . . . 16 1.6 Java socket - 一个多线程示例 . . .. . . . 29 1.7 Java...
socket的基础学习代码,用于认识和学习socket的基本概念。包括TCP和UDP。
TCP/IP通信,使用Socket编程,java即时聊天室
使用java编写的类似聊天室的程序,在上次的基础上继续改进,将服务器端的IP地址写在配置文件里面,是程序的使用更加灵活,server.properties文件为配置文件,修改里面的ip地址为服务器端运行的ip地址即可使用。...
【完整课程列表】 ... 完整版精品java课件 Java基础入门教程 Java程序设计 第1章 Java语言概述(共38页).ppt ...完整版精品java课件 Java基础入门教程 Java程序设计 第14章 socket网络编程(共24页).ppt
第二章 Socket编程基础 6 2.1 Socket编程的概念 6 2.2 Socket编程的基本流程 8 2.3 Socket编程的常用API 9 第三章 Java Socket编程实现 11 3.1 Java Socket编程的实现原理 11 3.2 Java Socket编程的实现步骤 13 3.3 ...
服务端并没有大的改动,在原有的基础上加上线程池, 客户端界面只有简单的传一个路径,不进行socket的链接, 调用客户端的方法,方法中有线程,线程中进行socket的链接,这样才能实现多个文件的传输。
是我学习Socket编程时写的,很简单的代码,可以看看,希望有用
基于Java Socket网络编程的基础性应用研究
基于Java Socket网络编程的基础性应用研究.pdf
【完整课程列表】 ... 完整版精品java课件 Java基础入门教程 Java程序设计 第1章 Java语言概述(共38页).ppt ...完整版精品java课件 Java基础入门教程 Java程序设计 第14章 socket网络编程(共24页).ppt
使用Java socket 进行通信