Java网络编程基础篇之单向通信 原创
在网络编程中如果只要求客户机向服务器发送消息,不要求服务器向客户机发送消息,称为单线通信。客户机套接字和服务器套接字链接成功后,可估计通过输出流发送数据,服务器则通过输入流接受数据,下面是简单的单向通信的例子。
实例1:本实例是一个tcp服务器端程序,在 getserver() 方法中建立服务器套接字,调用getclienmessage()方法获取客户端信息。代码如下:
import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.net.serversocket; import java.net.socket; public class mytcp { private bufferedreader reader; private serversocket server; private socket socket; void getserver() { try { server = new serversocket(8998); system.out.println("服务器套接字已经创建成功"); while(true) { system.out.println("等待客户机的连接"); socket = server.accept(); reader = new bufferedreader(new inputstreamreader(socket.getinputstream())); getclienmessage(); } }catch(exception e) { e.printstacktrace(); } } private void getclienmessage() { try { while (true) { system.out.println("客户机:"+ reader.readline()); } }catch(exception e) { e.printstacktrace(); } try { if(reader !=null) { reader.close(); } if(socket !=null) { socket.close(); } }catch(ioexception e) { e.printstacktrace(); } } public static void main(string[] args) { mytcp tcp = new mytcp(); tcp.getserver(); } }
运行结果:
服务器套接字已经创建成功
等待客户机的连接
下面我们再来看一下客户端程序。
实例2:客户端程序,实现将用户在文本框输入的信息发送到服务器端,并将文本框中输入的信息显示在客户端的文本域中。代码如下:
import java.awt.borderlayout; import java.awt.container; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.io.printwriter; import java.net.socket; import javax.swing.jframe; import javax.swing.jscrollpane; import javax.swing.jtextarea; import javax.swing.jtextfield; import javax.swing.border.bevelborder; public class myclien extends jframe{ private printwriter writer; socket socket; private jtextarea ta = new jtextarea(); private jtextfield tf = new jtextfield(); container cc; public myclien(string title) { super(title); setdefaultcloseoperation(jframe.exit_on_close); cc = this.getcontentpane(); final jscrollpane scrollpane = new jscrollpane(); scrollpane.setborder(new bevelborder(bevelborder.raised)); getcontentpane().add(scrollpane, borderlayout.center); scrollpane.setviewportview(ta); cc.add(tf,"south"); tf.addactionlistener(new actionlistener() { public void actionperformed(actionevent e) { writer.println(tf.gettext()); ta.append(tf.gettext()+ '\n'); ta.setselectionend(ta.gettext().length()); tf.settext(""); } }); } private void connect() { ta.append("尝试连接\n"); try { socket = new socket("127.0.0.1",8998); writer = new printwriter(socket.getoutputstream(),true); ta.append("完成连接\n"); }catch(exception e) { e.printstacktrace(); } } public static void main(string[] args) { myclien clien = new myclien("向服务器传送数据"); clien.setsize(200,200); clien.setvisible(true); clien.connect(); } }
服务器端运行结果:
服务器套接字已经创建成功
等待客户机的连接
客户机:革命尚未成功,同志仍需努力!
客户端运行结果:
尝试连接
完成连接
革命尚未成功,同志仍需努力!
说明:
当一台机器上安装了多个网络应用程序,很可能指定的端口号已被占用。还可能遇到以前运行良好的网络程序突然运行不了的情况,这种情况很可能也是由于端口被别的程序占用了。此时使用命令 netstat -an 来查看该程序所使用的端口。
在这里还有很重要的一点,本文所述两份源码,一个是服务器端程序,一个是客户端程序。运行时一定要先运行服务器端程序,然后运行客户端程序,而且两段代码的端口号一定要相同。
以上就是本文的全部内容,真心希望对大家有所帮助。学习是一件任重道远的事情,那句老话说得好:革命尚未成功,同志仍需努力!
感谢大家对本站的支持。
上一篇: Java内部类原理与用法实例总结
下一篇: mysql建表常用sql语句个人经验分享