socket
来源:互联网 发布:益思商科留学 知乎 编辑:程序博客网 时间:2024/05/22 05:48
今天终于有时间来实践一下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.
- socket
- socket
- Socket
- Socket
- Socket
- Socket
- Socket
- Socket
- socket
- Socket
- Socket
- Socket
- Socket
- socket
- socket
- socket
- socket
- socket
- REAL6410 WINCE6 矩阵键盘驱动
- IOS 7新特性--UIActionSheet
- QTP操作dataTable的操作方法
- 一个MapReuce作业的从开始到结束--第5章 把文件复制到HDFS的流程
- 2013年中国数据库大会PPT
- socket
- Linux下/proc目录简介
- Objective-C-类(static)方法、实例方法、overwrite(覆写)、属性(property)
- CSRF原理、测试方法
- java system.out.printf()的常见使用方法
- python 产生随机数,随机字符串
- ContentProvider,SQLiteOpenHelper,SQLiteDatabase三者之间的区别和联系
- 提取汉字首字母C#代码
- datatable中Global与Action的迭代