《java编程socket套接字网络编程.docx》由会员分享,可在线阅读,更多相关《java编程socket套接字网络编程.docx(15页珍藏版)》请在冰点文库上搜索。
.getPort()远程客户端的断后好33 //向客户端发送数据
34 dos.writeUTF("你好,客户端地址信息:
"+socket.getInetAddress()
35 +"\t客户端通信端口号:
"+socket.getPort());
36 dos.writeUTF("i'maserver,mynameishongten!
");
37 //关闭打开的输出流
38 dos.close();
39 //关闭打开的socket对象
40 socket.close();
41 }//开始下一此循环
42 }catch(IOExceptione){
43 e.printStackTrace();
44 }
45 }
46}
客户端代码:
1packagecom.b510.socket1703;
2
3importjava.io.*;
4import.Socket;
5
6/**
7 *客户端
8 *@authorHongten
9 *
10 *@time2012-4-292012
11 */
12publicclassTestClient{
13 publicstaticvoidmain(Stringargs[]){
14 try{
15 //创建socket对象,指定服务器的ip地址,和服务器监听的端口号
16 //客户端在new的时候,就发出了连接请求,服务器端就会进行处理,如果服务器端没有开启服务,那么
17 //这时候就会找不到服务器,并同时抛出异常==》.ConnectException:
Connection
18 //refused:
connect
19 Sockets1=newSocket("127.0.0.1",8888);
20 //打开输入流
21 InputStreamis=s1.getInputStream();
22 //封装输入流
23 DataInputStreamdis=newDataInputStream(is);
24 //打印服务器端发送过来的信息
25 System.out.println(dis.readUTF());
26 System.out.println(dis.readUTF());
27 //关闭输入流
28 dis.close();
29 //关闭打开的socket对象
30 s1.close();
31 }catch(IOExceptione){
32 e.printStackTrace();
33 }
34 }
35}
如果服务器端没有打开,这时候运行客户端,出现的结果:
1.ConnectException:
Connectionrefused:
connect
2 at.PlainSocketImpl.socketConnect(NativeMethod)
3 at.PlainSocketImpl.doConnect(PlainSocketImpl.java:
333)
4 at.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:
195)
5 at.PlainSocketImpl.connect(PlainSocketImpl.java:
182)
6 at.SocksSocketImpl.connect(SocksSocketImpl.java:
366)
7 at.Socket.connect(Socket.java:
518)
8 at.Socket.connect(Socket.java:
468)
9 at.Socket.(Socket.java:
365)
10 at.Socket.(Socket.java:
179)
11 atcom.b510.socket1703.TestClient.main(TestClient.java:
19)
如果服务器端先打开服务,这时候客户端连接服务器端,出现的效果:
1你好,客户端地址信息:
/127.0.0.1 客户端通信端口号:
2800
2i'maserver,mynameishongten!
============================================================
2.实现单线程的聊天室
============================================================
服务器端代码:
1packagecom.b510.socket1704.simplechatroom;
2
3importjava.io.*;
4import.Socket;
5import.ServerSocket;
6import.SocketException;
7
8/**
9 *服务器端程序,在while循环中所执行的动作是:
10 *听,说,听,说,听,说...
11 *
12 *@authorHongten
13 *
14 *@time2012-4-292012
15 */
16publicclassTestServer{
17 publicstaticvoidmain(Stringargs[]){
18 try{
19 //创建一个socket对象
20 ServerSockets=newServerSocket(8888);
21 //socket对象调用accept方法,等待连接请求
22 Sockets1=s.accept();
23 //打开输出流
24 OutputStreamos=s1.getOutputStream();
25 //封装输出流
26 DataOutputStreamdos=newDataOutputStream(os);
27 //打开输入流
28 InputStreamis=s1.getInputStream();
29 //封装输入流
30 DataInputStreamdis=newDataInputStream(is);
31 //读取键盘输入流
32 InputStreamReaderisr=newInputStreamReader(System.in);
33 //封装键盘输入流
34 BufferedReaderbr=newBufferedReader(isr);
35
36 Stringinfo;
37 while(true){
38 //接受客户端发送过来的信息
39 info=dis.readUTF();
40 //打印接受的信息
41 System.out.println("对方说:
"+info);
42 //如果发现接受的信息为:
bye,那么就结束对话
43 if(info.equals("bye"))
44 break;
45 //读取键盘的输入流
46 info=br.readLine();
47 //写入到网络连接的另一边,即客户端
48 dos.writeUTF(info);
49 //如果服务器自己说:
bye,也是结束对话
50 if(info.equals("bye"))
51 break;
52 }
53 //关闭输入流
54 dis.close();
55 //关闭输出流
56 dos.close();
57 //关闭socket对象
58 s1.close();
59 s.close();
60 }catch(SocketExceptione){
61 System.out.println("网络连接异常,程序退出!
");
62 }catch(IOExceptione){
63 e.printStackTrace();
64 }
65 }
66}
客户端代码:
1packagecom.b510.socket1704.simplechatroom;
2
3importjava.io.*;
4import.Socket;
5import.SocketException;
6/**
7 *客户端程序,在while循环中所执行的动作是:
8 *说,听,说,听,说,听....
9 *@authorHongten
10 *
11 *@time2012-4-29 2012
12 */
13publicclassTestClient{
14 publicstaticvoidmain(Stringargs[]){
15 try{
16 //创建socket对象,指定服务器的ip地址,和服务器监听的端口号
17 //客户端在new的时候,就发出了连接请求,服务器端就会进行处理,如果服务器端没有开启服务,那么
18 //这时候就会找不到服务器,并同时抛出异常==》.ConnectException:
Connection
19 //refused:
connect
20 Sockets1=newSocket("localhost",8888);
21 //打开输出流
22 OutputStreamos=s1.getOutputStream();
23 //封装输出流
24 DataOutputStreamdos=newDataOutputStream(os);
25 //打开输入流
26 InputStreamis=s1.getInputStream();
27 //封装输入流
28 DataInputStreamdis=newDataInputStream(is);
29 //读取键盘输入流
30 InputStreamReaderisr=newInputStreamReader(System.in);
31 //封装键盘输入流
32 BufferedReaderbr=newBufferedReader(isr);
33
34 Stringinfo;
35 while(true){
36 //客户端先读取键盘输入信息
37 info=br.readLine();
38 //把他写入到服务器方
39 dos.writeUTF(info);
40 //如果客户端自己说:
bye,即结束对话
41 if(info.equals("bye"))
42 break;
43 //接受服务器端信息
44 info=dis.readUTF();
45 //打印
46 System.out.println("对方说:
"+info);
47 if(info.equals("bye"))
48 break;
49 }
50 //关闭相应的输入流,输出流,socket对象
51 dis.close();
52 dos.close();
53 s1.close();
54 }catch(IOExceptione){
55 e.printStackTrace();
56 }
57 }
58}
运行效果:
服务器端效果>>>
1对方说:
hell
2你好
3对方说:
嘿嘿
4你今天
5对方说:
13
6代售点
客户端端效果>>>
1hell
2对方说:
你好
3嘿嘿
4对方说:
你今�?
513
6对方说:
代售�?
当前的程序不管是服务器端,还是客户端,都是单线程的。
如:
服务器端说:
"你好"
1//读取键盘的输入流
2info=br.readLine();
3//写入到网络连接的另一边,即客户端
4dos.writeUTF(info);
5//如果服务器自己说:
bye,也是结束对话
通过上面的代码,把"你好"发送出去了,这时候,程序又开始循环,运行到:
1//接受客户端发送过来的信息
2info=dis.readUTF();
这段代码,其实在这里就阻塞在这里了。
要等到客户端那边说了话,"嘿嘿",这时候这里的
阻塞才会变为非阻塞状态,然后又继续说,说完后又继续阻塞......
而对于客户端来说,其实是一样的道理,客户端说完"hello"后,进入:
1//接受服务器端信息
2info=dis.readUTF();
到收听服务器端的信息,在这里也产生了阻塞,只有服务器端说了"你好",这个阻塞才变为非阻塞
状态。
然后又继续接下来的动作....
============================================================
3.实现多线程的聊天室
============================================================
服务器端代码:
1packagecom.b510.socket1705.freeechatroom;
2
3importjava.io.*;
4import.*;
5
6/**
7 *服务器端程序
8 *
9 *@authorHongten
10 *
11 *@time2012-4-292012
12 */
13publicclassTestServer{
14 publicstaticvoidmain(Stringargs[]){
15 try{
16 //创建一个socket对象
17 ServerSockets=newServerSocket(8888);
18 //socket对象调用accept方法,等待连接请求
19 Sockets1=s.accept();
20
21 //=========服务器端,在这里应该先打开输出流,在打开输入流,
22 //=========因为服务器端执行的操作是先听,再说,听,说,听,说.....
23
24 //打开输出流
25 OutputStreamos=s1.getOutputStream();
26 //封装输出流
27 DataOutputStreamdos=newDataOutputStream(os);
28 //打开输入流
29 InputStreamis=s1.getInputStream();
30 //封装输入流
31 DataInputStreamdis=newDataInputStrea