今天终于有时间来实践一下Java socket的使用方法了,需要注意几个问题:
(1)、使用socket.getInputStream 读取数据时,该方法是阻塞方法,即如果管道流中没有数据时,使用inputStream.read(byte)是会一直阻塞,所以如果想要使用inputStream.read(new byte[]) > 0 来结束
循环是行不通的;
(2)、由于我的目的是不停的交互数据,所以不能IO流关闭,也不能把socket会话关闭,否则数据交换就会停止。
贴代码做记录:
1、服务端代码:
001 | package com.server; |
002 |
003 | import java.io.IOException; |
004 | import java.io.InputStream; |
005 | import java.io.OutputStream; |
006 | import java.net.ServerSocket; |
007 | import java.net.Socket; |
008 |
009 | import com.base.Constant; |
010 |
011 | public class
ServerMain { |
012 | /** |
013 | * @param args |
014 | */ |
015 | public
static void
main(String[] args) { |
016 | ServerSocket serverSocket =
null ; |
017 | System.out.println( "ServerSocket Begin........" ); |
018 | int
num = 0 ; |
019 | try
{ |
020 | serverSocket =
new ServerSocket(Constant.PORT); |
021 | //使用循环方式一直等待客户端的连接 |
022 | while ( true ){ |
023 | num ++; |
024 | Socket accept = serverSocket.accept(); |
025 | //启动一个新的线程,接管与当前客户端的交互会话 |
026 | new
Thread( new
ServerThread(accept), "Client " +num).start(); |
027 | } |
028 | }
catch (IOException e) { |
029 | e.printStackTrace(); |
030 | } |
031 | finally { |
032 | try
{ |
033 | serverSocket.close(); |
034 | System.out.println( "----> serverSocket closed." ); |
035 | }
catch (IOException e) { |
036 | e.printStackTrace(); |
037 | } |
038 | } |
039 | } |
040 | } |
041 | /** |
042 | * @author JCC |
043 | * 服务器处理客户端会话的线程 |
044 | */ |
045 | class ServerThread
implements Runnable { |
046 | |
047 | Socket socket =
null ; |
048 | public
ServerThread(Socket socket){ |
049 | System.out.println( "Create a new ServerThread..." ); |
050 | this .socket = socket; |
051 | } |
052 |
053 | @Override |
054 | public
void run() { |
055 | InputStream in =
null ; |
056 | OutputStream out =
null ; |
057 | try
{ |
058 | in = socket.getInputStream(); |
059 | out = socket.getOutputStream(); |
060 | //使用循环的方式,不停的与客户端交互会话 |
061 | while ( true ){ |
062 | try
{ |
063 | Thread.sleep( 1000 ); |
064 | }
catch (InterruptedException e) { |
065 | e.printStackTrace(); |
066 | } |
067 | //处理客户端发来的数据 |
068 | doRead(in); |
069 | System.out.println( "send Message to client." ); |
070 | //发送数据回客户端 |
071 | doWrite(out); |
072 | } |
073 | |
074 | }
catch (IOException e) { |
075 | e.printStackTrace(); |
076 | } |
077 | finally { |
078 | try
{ |
079 | in.close(); |
080 | out.close(); |
081 | }
catch (IOException e) { |
082 | // TODO Auto-generated catch block |
083 | e.printStackTrace(); |
084 | } |
085 | } |
086 | } |
087 | |
088 | /** |
089 | * 读取数据 |
090 | * @param in |
091 | * @return |
092 | */ |
093 | public
boolean doRead(InputStream in){ |
094 | //引用关系,不要在此处关闭流 |
095 | try
{ |
096 | byte [] bytes =
new byte [in.available()]; |
097 | in.read(bytes); |
098 | System.out.println( "line:" + new
String(bytes).trim()); |
099 | }
catch (IOException e) { |
100 | e.printStackTrace(); |
101 | } |
102 | |
103 | return
true ; |
104 | } |
105 | |
106 | /** |
107 | * 写入数据 |
108 | * @param out |
109 | * @return |
110 | */ |
111 | public
boolean doWrite(OutputStream out){ |
112 | //引用关系,不要在此处关闭流 |
113 | try
{ |
114 | out.write( "welcome you client." .getBytes()); |
115 | out.flush();
|
116 | }
catch (IOException e) { |
117 | // TODO Auto-generated catch block |
118 | e.printStackTrace(); |
119 | } |
120 | return
true ; |
121 | } |
122 | } |
2、客户端代码:
001 | package com.client; |
002 |
003 | import java.io.IOException; |
004 | import java.io.InputStream; |
005 | import java.io.OutputStream; |
006 | import java.net.Socket; |
007 | import java.net.UnknownHostException; |
008 |
009 | import com.base.Constant; |
010 |
011 | class ClientMain { |
012 | /** |
013 | * @param args |
014 | */ |
015 | public
static void
main(String[] args) { |
016 | Socket socket =
null ; |
017 | System.out.println( "ClientSocket Begin........" ); |
018 | try
{ |
019 | for ( int
i = 0 ;i< 5 ;i++){ |
020 | socket =
new Socket(Constant.SERVER_IP,Constant.PORT); |
021 | new
Thread( new
ClientThread(socket,i), "ClientThread " +i).start(); |
022 | } |
023 | |
024 | }
catch (UnknownHostException e) { |
025 | e.printStackTrace(); |
026 | }
catch (IOException e) { |
027 | e.printStackTrace(); |
028 | } |
029 | } |
030 | |
031 | |
032 | } |
033 |
034 | /** |
035 | * 客户端线程 |
036 | * @author JCC |
037 | * |
038 | */ |
039 | class ClientThread
implements Runnable{ |
040 | Socket socket =
null ; |
041 | int
id = 0 ; |
042 | public
ClientThread(Socket socket, int
id){ |
043 | this .socket = socket; |
044 | this .id = id; |
045 | } |
046 | @Override |
047 | public
void run() { |
048 | OutputStream out =
null ; |
049 | InputStream in =
null ; |
050 | System.out.println( "Begin to Chat to server..." ); |
051 | try
{ |
052 | out = socket.getOutputStream(); |
053 | in = socket.getInputStream(); |
054 | //循环发送与服务端不停的交互数据 |
055 | while ( true ){ |
056 | try
{ |
057 | Thread.sleep( 1000 ); |
058 | }
catch (InterruptedException e) { |
059 | e.printStackTrace(); |
060 | } |
061 | doWrite(out); |
062 | System.out.println( "begin read message from server." ); |
063 | doRead(in); |
064 | } |
065 | |
066 | }
catch (IOException e) { |
067 | e.printStackTrace(); |
068 | } |
069 | finally { |
070 | try
{ |
071 | in.close(); |
072 | out.close(); |
073 | }
catch (IOException e) { |
074 | e.printStackTrace(); |
075 | } |
076 | } |
077 | } |
078 | |
079 | /** |
080 | * 读取服务端数据 |
081 | * @param in |
082 | * @return |
083 | */ |
084 | public
static boolean
doRead(InputStream in){ |
085 | //引用关系,不要在此处关闭流 |
086 | byte [] bytes =
new byte [ 1024 ]; |
087 | try
{ |
088 | in.read(bytes); |
089 | System.out.println( "line:" + new
String(bytes).trim()); |
090 | }
catch (IOException e) { |
091 | e.printStackTrace(); |
092 | } |
093 | |
094 | return
true ; |
095 | } |
096 | |
097 | /** |
098 | * 发送数据到服务端 |
099 | * @param out |
100 | * @return |
101 | */ |
102 | public
boolean doWrite(OutputStream out){ |
103 | //引用关系,不要在此处关闭流 |
104 | String line =
"Hello server, I am client = " +id + "\n" ; |
105 | line = line + "I want you to do something for me" ; |
106 | try
{ |
107 | out.write(line.getBytes()); |
108 | out.flush();
|
109 | }
catch (IOException e) { |
110 | e.printStackTrace(); |
111 | } |
112 | return
true ; |
113 | } |
114 | } |
3、常量类:
1 | package com.base; |
2 |
3 | public interface
Constant { |
4 |
5 | public
static final
String SERVER_IP = "192.168.1.44" ; |
6 | public
static final
int PORT = 4567 ;
|
7 | } |
执行结果:
(1)服务端结果:
01 | ServerSocket Begin........ |
02 | Create a new
ServerThread... |
03 | Create a new
ServerThread... |
04 | Create a new
ServerThread... |
05 | Create a new
ServerThread... |
06 | Create a new
ServerThread... |
07 | line: |
08 | send Message to client. |
09 | line: |
10 | send Message to client. |
11 | line: |
12 | send Message to client. |
13 | line:Hello server, I am client = 3 |
14 | I want you to do
something for
me |
15 | send Message to client. |
16 | line:Hello server, I am client = 4 |
17 | I want you to do
something for
me |
18 | send Message to client. |
19 | line:Hello server, I am client = 0 |
20 | I want you to do
something for
me |
21 | send Message to client. |
22 | line:Hello server, I am client = 1 |
23 | I want you to do
something for
me |
24 | send Message to client. |
25 | line:Hello server, I am client = 2 |
26 | I want you to do
something for
me |
27 | send Message to client. |
28 | line: |
29 | send Message to client. |
30 | line: |
31 | send Message to client. |
32 | line:Hello server, I am client = 0 |
33 | I want you to do
something for
me |
34 | send Message to client. |
35 | line:Hello server, I am client = 1 |
36 | I want you to do
something for
me |
37 | send Message to client. |
38 | line:Hello server, I am client = 2 |
39 | I want you to do
something for
me |
40 | send Message to client. |
41 | line:Hello server, I am client = 3 |
42 | I want you to do
something for
me |
43 | send Message to client. |
44 | line:Hello server, I am client = 4 |
45 | I want you to do
something for
me |
46 | send Message to client. |
47 | line:Hello server, I am client = 0 |
48 | I want you to do
something for
me |
49 | send Message to client. |
(2)客户端结果:
01 | ClientSocket Begin........ |
02 | Begin to Chat to server... |
03 | Begin to Chat to server... |
04 | Begin to Chat to server... |
05 | Begin to Chat to server... |
06 | Begin to Chat to server... |
07 | begin read message from server. |
08 | line:welcome you client. |
09 | begin read message from server. |
10 | line:welcome you client. |
11 | begin read message from server. |
12 | line:welcome you client. |
13 | begin read message from server. |
14 | line:welcome you client. |
15 | begin read message from server. |
16 | line:welcome you client. |
17 | begin read message from server. |
18 | line:welcome you client. |
19 | begin read message from server. |
20 | line:welcome you client. |
21 | begin read message from server. |
22 | line:welcome you client. |
23 | begin read message from server. |
24 | line:welcome you client. |
25 | begin read message from server. |
26 | line:welcome you client. |
27 | begin read message from server. |
28 | line:welcome you client. |
29 | begin read message from server. |
30 | line:welcome you client. |
31 | begin read message from server. |