java实现socket客户端连接服务端
程序员文章站
2024-03-06 23:23:56
本例只做简单功能演示,代码并不严谨,只是说明客户端如何实现连接服务端简单代码。
代码在集成eclipse工具下测试编译运行环境如下图所示:
客户端echoclien...
本例只做简单功能演示,代码并不严谨,只是说明客户端如何实现连接服务端简单代码。
代码在集成eclipse工具下测试编译运行环境如下图所示:
客户端echoclient.java代码:
package com.zhengzz.echo; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.socket; import java.net.unknownhostexception; class echoc{ private socket socket; public echoc() { // todo auto-generated constructor stub try { socket = new socket("localhost", 60000); } catch (unknownhostexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } } public void client() { try { bufferedreader br = new bufferedreader(new inputstreamreader(socket.getinputstream())); printwriter pw = new printwriter(socket.getoutputstream(), true); bufferedreader lbr = new bufferedreader(new inputstreamreader(system.in)); string linestr = null; while ((linestr = lbr.readline()) != null) { pw.println(linestr); system.out.println(br.readline()); if (linestr.equals("bye#")) { break; } } } catch (ioexception e) { e.printstacktrace(); } } } public class echoclient { public static void main(string[] args) { new echoc().client(); } }
服务端echoserver.java代码:
package com.zhengzz.echo; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.serversocket; import java.net.socket; class echos{ private serversocket serversocket; public echos() { try { serversocket = new serversocket(60000); } catch (ioexception e) { e.printstacktrace(); } } public void server() { while (true) { try { socket socket = serversocket.accept(); system.out.println("client:" + socket.getinetaddress() + ":" + socket.getlocalport()); bufferedreader br = new bufferedreader(new inputstreamreader(socket.getinputstream())); printwriter pw = new printwriter(socket.getoutputstream(), true); string linestr; while ((linestr = br.readline()) != null) { system.out.println(linestr); pw.println("--->" + linestr); } } catch (ioexception e) { system.out.println("连接断开:("); } } } } public class echoserver { public static void main(string[] args) { new echos().server(); } }
我在eclipse工具下直接调试结果如下:
下面我们再来看一个 helloword 级别的 java socket 通信的例子。通讯过程:
先启动 server 端,进入一个死循环以便一直监听某端口是否有连接请求。然后运行 client 端,客户端发出连接请求,服务端监听到这次请求后向客户端发回接受消息,连接建立,启动一个线程去处理这次请求,然后继续死循环监听其他请求。客户端输入字符串后按回车键,向服务器发送数据。服务器读取数据后回复客户端数据。这次请求处理完毕,启动的线程消亡。如果客户端接收到 "ok" 之外的返回数据,会再次发送连接请求并发送数据,服务器会为这次连接再次启动一个线程来进行响应。。。直到当客户端接收到的返回数据为 "ok" 时,客户端退出。
服务端源代码:
package com.defonds.socket.begin; import java.io.bufferedreader; import java.io.datainputstream; import java.io.dataoutputstream; import java.io.inputstreamreader; import java.net.serversocket; import java.net.socket; public class server { public static final int port = 12345;//监听的端口号 public static void main(string[] args) { system.out.println("服务器启动...\n"); server server = new server(); server.init(); } public void init() { try { serversocket serversocket = new serversocket(port); while (true) { // 一旦有堵塞, 则表示服务器与客户端获得了连接 socket client = serversocket.accept(); // 处理这次连接 new handlerthread(client); } } catch (exception e) { system.out.println("服务器异常: " + e.getmessage()); } } private class handlerthread implements runnable { private socket socket; public handlerthread(socket client) { socket = client; new thread(this).start(); } public void run() { try { // 读取客户端数据 datainputstream input = new datainputstream(socket.getinputstream()); string clientinputstr = input.readutf();//这里要注意和客户端输出流的写方法对应,否则会抛 eofexception // 处理客户端数据 system.out.println("客户端发过来的内容:" + clientinputstr); // 向客户端回复信息 dataoutputstream out = new dataoutputstream(socket.getoutputstream()); system.out.print("请输入:\t"); // 发送键盘输入的一行 string s = new bufferedreader(new inputstreamreader(system.in)).readline(); out.writeutf(s); out.close(); input.close(); } catch (exception e) { system.out.println("服务器 run 异常: " + e.getmessage()); } finally { if (socket != null) { try { socket.close(); } catch (exception e) { socket = null; system.out.println("服务端 finally 异常:" + e.getmessage()); } } } } } }
客户端源代码:
package com.defonds.socket.begin; import java.io.bufferedreader; import java.io.datainputstream; import java.io.dataoutputstream; import java.io.ioexception; import java.io.inputstreamreader; import java.net.socket; public class client { public static final string ip_addr = "localhost";//服务器地址 public static final int port = 12345;//服务器端口号 public static void main(string[] args) { system.out.println("客户端启动..."); system.out.println("当接收到服务器端字符为 \"ok\" 的时候, 客户端将终止\n"); while (true) { socket socket = null; try { //创建一个流套接字并将其连接到指定主机上的指定端口号 socket = new socket(ip_addr, port); //读取服务器端数据 datainputstream input = new datainputstream(socket.getinputstream()); //向服务器端发送数据 dataoutputstream out = new dataoutputstream(socket.getoutputstream()); system.out.print("请输入: \t"); string str = new bufferedreader(new inputstreamreader(system.in)).readline(); out.writeutf(str); string ret = input.readutf(); system.out.println("服务器端返回过来的是: " + ret); // 如接收到 "ok" 则断开连接 if ("ok".equals(ret)) { system.out.println("客户端将关闭连接"); thread.sleep(500); break; } out.close(); input.close(); } catch (exception e) { system.out.println("客户端异常:" + e.getmessage()); } finally { if (socket != null) { try { socket.close(); } catch (ioexception e) { socket = null; system.out.println("客户端 finally 异常:" + e.getmessage()); } } } } } }
注意: socket 输出流写数据方法是 writeutf 时,输入流读取相关数据要用 readutf。否则会抛 eofexception 异常。