1、32 Java网络编程32. Java网络编程本季讲解了JAVA中TCP和UDP程序的设计,同时讲解了多线程在服务器编程上的作用。 blog: 零基础学JAVAJava SE应用部分-32.Java网络编程 2009-03-05C/S程序:表示的客户/服务器程序,每次需要编写两套程序|- MSN、QQ:一般会有两套程序,一个是服务器端,另外一个是客户端B/S程序:表示的浏览器/ 服务器,可以理解为动态WEB,论坛本季目标Sock:TCP通讯数据报:UDP通讯Socket程序需要的类:1、所有的用户对于服务器来讲都是一个Socket客户端。2、在服务器上使用ServerSocket类接收客户端的
2、SocketSocket通信模型Socket编程的四个基本步骤编写一个服务器程序:ServerSocket只要是网络连接都要求有一个端口public ServerSocket(int port)public Socket accept() throws IOException通过此方法等待客户端的socket进行访问。ServerSocket01服务器端代码:此服务器端的功能非常的简单,就是接收客户端的请求,之后在屏幕上输出哈Windows中有一个telnet命令,通过此命令就可以直接连接到服务器了。客户端收到字符串,同时服务器端显示“客户端回应完毕”只要是符合网络的协议标准,所有的客户端都可
3、以连接到此服务器端上。但是一般情况下,很少说直接去使用telnet连接,往往会编写一个客户端。Socketpublic Socket(String host,int port) throws UnknownHostException,IOException指定一个主机的IP地址和一个端口ClientSocket01客户端代码:验证下效果,和telnet一样哈以上代码验证了,程序需要编写两套程序: 一个是服务器端 另外一个是客户端现在发现所有的代码只是执行一次就完了,那么能不能说执行多次呢?由我的用户可以自己发出中断的指令。这样的做法我们可以做一个Socket经典 Echo程序用户发什么内容,服
4、务器就会回应什么内容:EchoServer代码:importjava.io.*;import.*;publicclassEchoServer/此处为了省去处理try.catch直接抛出了异常publicstaticvoidmain(String args)throwsExceptionServerSocket server =null;/输出肯定使用打印流PrintStream out =null;/服务器肯定也要接收输入BufferedReader buf =null;/1.实例化一个服务器的监听端server =newServerSocket(9999);/可以使用一种死循环的方式接收内容
5、Socket client =null;while(true)/不断接收内容client = server.accept();/准备好向客户端输出内容out =newPrintStream(client.getOutputStream();/而且客户端要有输入给服务器端buf =newBufferedReader(newInputStreamReader(client.getInputStream();/下面先给出一个完整的信息提示out.println(您好!欢迎光临:);out.println(输入bye表示退出哈);/一个用户要发很多的信息while(true)/接收客户端发送而来的内容
6、String str = buf.readLine();if(str=null)/如果str为空就表示退出break;else/如果输入的是bye则表示系统退出if(bye.equals(str)break;/可以对用户发来的信息进行回应out.println(ECHO:+str);/进行收尾工作out.close();buf.close();client.close();/如果要关闭服务器时可以设置标志/server.close();看下效果:现在我们用telnet连接上去看下效果输入bye退出连接同时可以多次连接典型的包含了输入和输出EchoClient代码:importjava.io.*
7、;import.*;publicclassEchoClientpublicstaticvoidmain(String args)throwsExceptionSocket client =null;BufferedReader buf =null;PrintStream out =null;/1.连接服务器client =newSocket(localhost,9999);/接收服务器端的输入信息buf =newBufferedReader(newInputStreamReader(client.getInputStream();System.out.println(buf.readLine(
8、);System.out.println(buf.readLine();/之后准备从键盘接收数据BufferedReader in =newBufferedReader(newInputStreamReader(System.in);String userInput =null;out =newPrintStream(client.getOutputStream();while(userInput=in.readLine()!=null)/表示有内容进来,要把内容发送到客户端out.println(userInput);/接收服务器端的回应System.out.println(buf.read
9、Line();out.close();in.close();client.close();但是此程序有一个问题,即:当一个用户操作的时候,其他用户是不能操作的程序是单线程的,所以每次只能一个用户访问。此处如果想解决,则只能使用多线程进行操作。首先需要编写一个线程的类:ThreadServer代码:importjava.io.*;import.*;publicclassThreadServerimplementsRunnable/现在所有的Socket都要归入到一个线程之中privateSocket client =null;publicThreadServer(Socket client)th
10、is.client = client;publicvoidrun()/要不断的接收客户发送来的信息String input =null;/通过BufferedReader进行接收BufferedReader buf =null;/有一个输出的对象PrintStream out =null;trybuf =newBufferedReader(newInputStreamReader(this.client.getInputStream();while(true)/接收发送过来的信息input = buf.readLine();out =newPrintStream(this.client.get
11、OutputStream();if(bye.equals(input)break;elseout.println(ECHO:+input);this.client.close();catch(Exception e)EchoServer01服务器端代码:importjava.io.*;import.*;publicclassEchoServer01/此处为了省去处理try.catch直接抛出了异常publicstaticvoidmain(String args)throwsExceptionServerSocket server =null;/输出肯定使用打印流PrintStream out
12、=null;/服务器肯定也要接收输入BufferedReader buf =null;/1.实例化一个服务器的监听端server =newServerSocket(9999);/可以使用一种死循环的方式接收内容Socket client =null;while(true)/不断接收内容client = server.accept();/在此处启动了一个线程newThread(newThreadServer(client).start();使用telnet测试效果哈通过以上代码,可以发现,多线程实际上在服务器上是比较常用的。服务器 = 多线程 + IO + SocketSocket程序实际上是属
13、于TCP程序,是一个稳定的连接UDP程序:数据报程序Send发送端代码:importjava.io.*;import.*;publicclassSendpublicstaticvoidmain(String args)throwsExceptionDatagramSocket ds =null;DatagramPacket dp =null;/发送端必须有一个监视的端口ds =newDatagramSocket(9999);String str =;/发送的内容只能是byte数组/接收端端口号是8888dp =newDatagramPacket(str.getBytes(),str.lengt
14、h(),InetAddress.getByName(localhost),8888);ds.send(dp);ds.close();看下效果:信息已经发送出去了哈下面我们再写个接收代码Receive接收端代码:importjava.io.*;import.*;publicclassReceivepublicstaticvoidmain(String args)throwsExceptionDatagramSocket ds =null;DatagramPacket dp =null;/要有一个空间大小byteb =newbyte1024;/ds的监听端口就表示发送端指定好的ds =newDatagramSocket(8888);dp =newDatagramPacket(b,b.length);/开始接收ds.receive(dp);System.out.println(newString(dp.getData().trim();ds.close();现在我们测试一下哈首先必须接收端开启着然后我们运行发送端发送信息总结网络编程在实际中确实使用越来越少,JAVA的主要特点全部集中在了JAVA WEB上了。只需要了解以下概念即可: 网络程序的分类:TCP、UDP 服务器 = IO + Socket + Thread#本文出自 “王乾De技术博客” 博客,谢绝转载!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1