本文实例讲述了java基于socket实现的客户端和服务端通信功能。分享给大家供大家参考,具体如下:
以下代码参考马士兵的聊天项目,先运行chatserver.java实现端口监听,然后再运行chatclient.java
客户端实例
chatclient.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
package socketdemo;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class chatclient extends frame {
socket s = null ;
dataoutputstream dos = null ;
datainputstream dis = null ;
private boolean bconnected = false ;
textfield tftxt = new textfield();
textarea tacontent = new textarea();
thread trecv = new thread( new recvthread());
public static void main(string[] args) {
new chatclient().launchframe();
}
public void launchframe() {
setlocation( 400 , 300 );
this .setsize( 300 , 300 );
add(tftxt, borderlayout.south);
add(tacontent, borderlayout.north);
pack();
this .addwindowlistener( new windowadapter() {
@override
public void windowclosing(windowevent arg0) {
disconnect();
system.exit( 0 );
}
});
tftxt.addactionlistener( new tflistener());
setvisible( true );
connect();
trecv.start();
}
public void connect() {
try {
s = new socket( "localhost" , 8888 );
dos = new dataoutputstream(s.getoutputstream());
dis = new datainputstream(s.getinputstream());
system.out.println( "connected!" );
bconnected = true ;
} catch (unknownhostexception e) {
e.printstacktrace();
} catch (ioexception e) {
e.printstacktrace();
}
}
public void disconnect() {
try {
dos.close();
dis.close();
s.close();
} catch (ioexception e) {
e.printstacktrace();
}
/*
* try { bconnected = false; trecv.join(); } catch(interruptedexception
* e) { e.printstacktrace(); } finally { try { dos.close(); dis.close();
* s.close(); } catch (ioexception e) { e.printstacktrace(); } }
*/
}
private class tflistener implements actionlistener {
public void actionperformed(actionevent e) {
string str = tftxt.gettext().trim();
// tacontent.settext(str);
tftxt.settext( "" );
try {
// system.out.println(s);
dos.writeutf(str);
dos.flush();
// dos.close();
} catch (ioexception e1) {
e1.printstacktrace();
}
}
}
private class recvthread implements runnable {
public void run() {
try {
while (bconnected) {
string str = dis.readutf();
// system.out.println(str);
tacontent.settext(tacontent.gettext() + str + '\n' );
}
} catch (socketexception e) {
system.out.println( "退出了,bye!" );
} catch (eofexception e) {
system.out.println( "推出了,bye - bye!" );
} catch (ioexception e) {
e.printstacktrace();
}
}
}
}
|
socket服务端代码
chatserver.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
package socketdemo;
import java.io.*;
import java.net.*;
import java.util.*;
public class chatserver {
boolean started = false ;
serversocket ss = null ;
list<client> clients = new arraylist<client>();
public static void main(string[] args) {
new chatserver().start();
}
public void start() {
try {
ss = new serversocket( 8888 );
started = true ;
} catch (bindexception e) {
system.out.println( "端口使用中...." );
system.out.println( "请关掉相关程序并重新运行服务器!" );
system.exit( 0 );
} catch (ioexception e) {
e.printstacktrace();
}
try {
while (started) {
socket s = ss.accept();
client c = new client(s);
system.out.println( "a client connected!" );
new thread(c).start();
clients.add(c);
// dis.close();
}
} catch (ioexception e) {
e.printstacktrace();
} finally {
try {
ss.close();
} catch (ioexception e) {
// todo auto-generated catch block
e.printstacktrace();
}
}
}
class client implements runnable {
private socket s;
private datainputstream dis = null ;
private dataoutputstream dos = null ;
private boolean bconnected = false ;
public client(socket s) {
this .s = s;
try {
dis = new datainputstream(s.getinputstream());
dos = new dataoutputstream(s.getoutputstream());
bconnected = true ;
} catch (ioexception e) {
e.printstacktrace();
}
}
public void send(string str) {
try {
dos.writeutf(str);
} catch (ioexception e) {
clients.remove( this );
system.out.println( "对方退出了!我从list里面去掉了!" );
// e.printstacktrace();
}
}
public void run() {
try {
while (bconnected) {
string str = dis.readutf();
system.out.println(str);
for ( int i = 0 ; i < clients.size(); i++) {
client c = clients.get(i);
c.send(str);
// system.out.println(" a string send !");
}
/*
* for(iterator<client> it = clients.iterator();
* it.hasnext(); ) { client c = it.next(); c.send(str); }
*/
/*
* iterator<client> it = clients.iterator();
* while(it.hasnext()) { client c = it.next(); c.send(str);
* }
*/
}
} catch (eofexception e) {
system.out.println( "client closed!" );
} catch (ioexception e) {
e.printstacktrace();
} finally {
try {
if (dis != null )
dis.close();
if (dos != null )
dos.close();
if (s != null ) {
s.close();
// s = null;
}
} catch (ioexception e1) {
e1.printstacktrace();
}
}
}
}
}
|
本机测试运行结果:
关闭客户端窗口后,提示信息如下:
希望本文所述对大家java程序设计有所帮助。
原文链接:https://blog.csdn.net/nuli888/article/details/51884931