本文实例讲述了Java编程实现基于TCP协议的Socket聊天室。分享给大家供大家参考,具体如下:
这里使用Socket套接字进行编程,完成的是基于TCP可靠服务实现服务器与客户端的双通信。
Server服务器端:
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
108
109
110
111
112
113
114
|
package com.han; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.*; import java.net.*; import javax.swing.JDialog; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; /** * 本程序实现了一个TCP程序的服务器编程部分。 * 使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与客户端的双通信。 * 客户端的编程见本包中的类Client * @author HAN * */ @SuppressWarnings ( "serial" ) public class Server extends JDialog{ private BufferedReader reader; private PrintWriter writer; private ServerSocket server; private Socket socket; private JTextArea ta= new JTextArea(); private JScrollPane sp= new JScrollPane(ta); private JTextField tf= new JTextField(); Container cc; public Server(String title) { setTitle(title); addWindowListener( new WindowAdapter() { public void windowClosing (WindowEvent we) { dispose(); //撤销dialog一切相关资源 System.exit( 0 ); //正常退出程序 } }); cc=getContentPane(); setLayout( null ); ta.setLineWrap( true ); ta.setEditable( false ); sp.setBounds( 0 , 0 , 300 , 342 ); tf.setBounds( 0 , 342 , 300 , 25 ); cc.add(sp); cc.add(tf); tf.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ try { writer= new PrintWriter(socket.getOutputStream(), true ); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } writer.println(tf.getText()); ta.append( "User1:" +tf.getText()+ '\n' ); tf.setText( "" ); } }); } void getserver(){ try { server= new ServerSocket( 8998 ); ta.append( "服务器套接字已经创建成功\n" ); while ( true ){ ta.append( "等待客户机的连接\n" ); socket=server.accept(); ta.append( "客户机已连接\n" ); reader= new BufferedReader( new InputStreamReader(socket.getInputStream())); getClientMessage(); } } catch (Exception e){ e.printStackTrace(); } } private void getClientMessage(){ try { while ( true ){ String news=reader.readLine(); if (news!= null ){ ta.append( "User2:" +news+ "\n" ); } else { ta.append( "User2(客户端) 已断开链接\n" ); break ; } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { if (reader!= null ){ reader.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (socket!= null ){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { Server user1= new Server( "User1" ); user1.setBounds( 0 , 0 , 300 , 400 ); user1.setResizable( false ); user1.setVisible( true ); user1.getserver(); } } |
Client客户端:
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
108
109
|
package com.han; import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; /** * 本程序实现了一个TCP程序的客户端编程部分。 * 使用Socket套接字进行编程,完成的是基于TCP可靠服务实现与服务器的双通信。 * 服务器的编程见本包中的类Server * 可以在不同的平台与不同的机器上运行,只是要把代码中写的IP地址修改为运行服务器程序Server的机器的IP地址。 * @author HAN * */ @SuppressWarnings ( "serial" ) public class Client extends JDialog{ private BufferedReader reader; private PrintWriter writer; private Socket socket; private JTextArea ta= new JTextArea(); private JScrollPane sp= new JScrollPane(ta); private JTextField tf= new JTextField(); Container cc; public Client(String title) { setTitle(title); addWindowListener( new WindowAdapter() { public void windowClosing (WindowEvent we) { dispose(); //撤销dialog一切相关资源 System.exit( 0 ); //正常退出程序 } }); cc=getContentPane(); setLayout( null ); ta.setLineWrap( true ); ta.setEditable( false ); sp.setBounds( 0 , 0 , 300 , 342 ); tf.setBounds( 0 , 342 , 300 , 25 ); cc.add(sp); cc.add(tf); tf.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ writer.println(tf.getText()); ta.append( "User2:" +tf.getText()+ '\n' ); tf.setText( "" ); } }); } private void connect(){ ta.append( "尝试连接\n" ); try { socket= new Socket( "192.168.1.3" , 8998 ); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { writer= new PrintWriter(socket.getOutputStream(), true ); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } ta.append( "完成连接\n" ); } private void getClientMessage(){ try { reader= new BufferedReader( new InputStreamReader(socket.getInputStream())); while ( true ){ String news=reader.readLine(); if (news!= null ){ ta.append( "User1:" +news+ "\n" ); } else { ta.append( "User1(服务器) 已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n" ); break ; } } } catch (IOException e) { // TODO Auto-generated catch block ta.append( "User1(服务器) 已断开链接,等待服务器重连之时,重启User2(客户端)进行通信\n" ); e.printStackTrace(); } try { if (reader!= null ){ reader.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (socket!= null ){ try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { Client user2= new Client( "User2" ); user2.setBounds( 0 , 0 , 300 , 400 ); user2.setVisible( true ); user2.setResizable( false ); user2.connect(); user2.getClientMessage(); } } |
希望本文所述对大家java程序设计有所帮助。
原文链接:http://blog.csdn.net/gaowen_han/article/details/7163709