如何使用java编写qq聊天程序网络通信程序

【】【】【】【】
········
  《全国专业技术人员计算机应用能力考试标准教程—word&2003中文字处理》严格根据..
定价:¥39.50
优惠价:¥29.60&&本书适合报考全国专业技术人员计算机应用能力考试“中文windows&xp操作系统”科目的..
定价:¥39.50
优惠价:¥29.60&&
············
············
         Copyright ©
() All Rights Reserved2977人阅读
利用java编写网络通信程序
作者:于洪斌、马俊光、车雪松
  一、java与网络通信
  java是一门适合于分布式计算环境、尤其是Internet程序设计的语言。这不仅仅在于java具有很好的安全性和可移植性,还在于java为Internet编程提供了丰富的网络类库支持。利用这些网络类库,可以轻松编写多种类型的网络通信程序。
  TCP/IP协议是当今最流行的协议,也是Internet的基础协议,它代表的是一个协议集合。除传输控制协议TCP和网际协议IP外,TCP/IP协议集还包括其他一些协议,如UDP、FTP、UUCP、ICMP等。
  一般的TCP/IP网络数据通信主要可分为两种不同的通信协议,一种是面向连接的通信协议,这种传输方式在数据传送前必须先在两端建立连接,并且所传送的数据不会丢失,这种方式称为TCP,也称为Stream;另一种方式则是面向非连接方式,即传送数据前,并不必先建立连接,而是将所要传送的数据包成一个分组再传送,使用这种方式,由于没有额外的控制,所以传送的数据可能丢掉。这种方式称为UDP,也称为Datagram。
  TCP和UDP都是传输层上的通信协议,也是一般TCP/IP网络上最常使用的通信协议,且各有其用途,如TCP较可靠,所以用在不允许数据丢失的应用上。而UDP则较多应用于处理速度要求较快、数据传输可靠性要求不是很高的应用上,如数据广播。在java中也支持这两种不同的协议,对它们的支持是以类库的形式提供的。通过Socket和ServerSocket类提供了对TCP通信的支持,对于UDP通信则提供了DatagramSocket和DatagramPacket类。它们都包含在java.net类库中。本文中,我们主要探讨TCP通信程序的写法,而UDP通信程序的写法与此类似。
   二、通信程序的编写
  在进一步讨论之前,我们先来看看Socket和ServerSocket类的定义(表1)和(表2),关于这两个类的详细内容请见sun公司的JDK或microsoft公司VJ++ 1.1的联机文档。
  要使用上面所提供的功能编写网络通信程序,我们可以将要通信的两端分成服务器和客户机端,即建立所谓的客户机/服务器编程模式。在服务器端必须先建立一个ServerSocket对象,然后等待客户机端的访问。而在客户机端,则是建立一个Socket对象直接跟服务器端连接,如果连接建立成功,则服务器端便会产生一个Socket对象,然后我们就可以利用这个Socket对象跟客户机端的Socket对象沟通了。此时在服务器和客户机之间建立了一条可靠连接,客户机和服务器可以在这条连接上可靠的传送数据。客户机发出请求,服务器监听来自客户机的请求,并为客户机提供相应的服务。
  基于上述原理,我们编写了简单的客户机/服务器模式的网络通信程序。在服务器端,服务器监听客户机的请求,为每个客户机请求建立Socket连接,从而为客户机提供服务。而所提供的服务只是读取来自客户机的一行文本,并把它发回给客户机。以下是服务器端的通信程序。
  import java.io.*;
  import java.net.*;
  class javaserver extends Thread {
   ServerS
   public javaserver() {
   try {
   server = new ServerSocket(600);
   catch(IOException e) {
   System.out.println("Cannot create Server");
   System.exit(0);
   System.out.println("Now socket server will Start");
   this.start();
   public void run() {
   try {
   while (true) {
   Socket client = server.accept();
   service ss = new service(client);
   catch(IOException e) {
   System.out.println("cannot provide service !");
   System.exit(1);
   public static void main(String args[]){
   DataInputStream KeyI
   new javaserver();
   KeyInput = new DataInputStream(System.in);
   try {
   data = KeyInput.readLine();
   catch (IOException e){
   if (data.equals("quit")) System.exit(1);
   class service extends Thread {
   DataInputStream InputS;
   PrintStream OutputS;
   Socket C
   public service(Socket ClientSocket) {
   Client = ClientS
   try {
   InputS = new DataInputStream
   (Client.getInputStream());
   OutputS = new PrintStream
   (Client.getOutputStream());
   catch (IOException e){
   System.out.println("Cannot Connect with Client !");
   this.start();
   public void run(){
   try {
   while (true){
   data = InputS.readLine();
   if (data == null)
   else {
   OutputS.println(data);
   System.out.println("From Client: " + data);
   catch (IOException e){
   System.out.println("Read Data error");
   try {
   Client.close();
   catch (IOException e){
   System.out.println("Cannot close socket");
   在上面的程序中,我们使用了多线程机制。javaserver和service对象本身都是一个线程。javaserver对象首先创建一个ServerSocket对象,并启动线程的运行。它的run()方法用于监听来自客户机的连接。每当有一个新的客户机连接时,ServerSocket就会创建一个新的Socket类实例,并创建一个service对象,同时启动这个对象的线程。每个service对象用于完成与客户机通信、提供服务的任务。这样服务器可以同时与多个客户机连接,同时为多个客户机提供服务。当从标准输入中接收到quit字符串时,服务器退出运行。
  在客户机端,首先创建一个Socket对象,用于与服务器通信。它从标准输入中读取数据,把这些数据传给服务器,再从服务器读取应答信息,然后把这些应答信息写到标准输出。当读取了5行的数据后,客户机程序将退出运行。以下是客户机端的通信程序。
  import java.io.*;
  import java.net.*;
  class javaclient {
   public static void main(String args[]){
   Socket C
   DataInputStream InputS;
   DataInputStream KeyS;
   PrintStream OutputS;
   int i = 0;
   try {
   Client = new Socket("172.17.3.2",600);
   InputS = new
   DataInputStream(Client.getInputStream());
   OutputS = new PrintStream
   (Client.getOutputStream());
   KeyS = new DataInputStream(System.in);
   catch(IOException e){
   System.out.println("Cannot Connect
   with Server");
   try {
   while (i&5){
   data = KeyS.readLine();
   OutputS.println(data);
   System.out.println("ECHO From
   Server:"+ InputS.readLine());
   catch(IOException e) {
   System.out.println("IOException
   Happened");
   System.out.println("Now will
   end this program");
   Client.close();
   catch(IOException e){
   System.out.println("system cannot
   close socket");
   三、结束语
  通过以上的讨论可知,用java语言编写网络通信程序非常简单,这主要是因为java语言本身就是一门面向网络编程的语言。java提供了多个可用于访问标准Internet协议的类库,从而支持多种Internet协议,包括:FTP,HTTP,NNTP和WWW等,这极大的简化了网络程序设计,可以比较方便的编写出功能完善的应用程序。
  以上只是我们对java语言进行网络通信程序设计的粗浅讨论。利用java语言进行程序设计的好处不一而论,愿我们能起到抛砖引玉的作用。
  联系地址:哈尔滨工程大学六系95级研究生
  邮政编码:150001
  联系电话:(5
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2708870次
积分:36436
积分:36436
排名:第105名
原创:939篇
评论:1629条
(2)(1)(1)(7)(15)(17)(2)(5)(5)(2)(2)(8)(3)(12)(12)(14)(5)(16)(18)(9)(3)(5)(6)(1)(3)(10)(6)(1)(4)(1)(2)(4)(4)(2)(2)(4)(3)(3)(13)(4)(2)(1)(10)(4)(5)(9)(4)(4)(3)(1)(1)(3)(4)(2)(6)(8)(5)(4)(9)(12)(14)(11)(6)(1)(2)(1)(4)(4)(19)(8)(21)(2)(36)(9)(1)(1)(3)(2)(1)(1)(7)(53)(5)(13)(14)(28)(25)(66)(29)(105)(41)(22)(48)(8)
() () () ()java例程练习(网络编程[简单UDP通信试验])-android100学习网
java例程练习(网络编程[简单UDP通信试验])
import java.net.*; import java.io.*; public class TestUDPServer {
public static void ma...
import java.net.*;
import java.io.*;
public class TestUDPServer {
public static void main(String[] args) throws Exception {
byte [] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);
DatagramSocket ds = new DatagramSocket(5678);
ByteArrayInputStream bais = new ByteArrayInputStream(buf);
while(true) {
DataInputStream dis = new DataInputStream(bais);
ds.receive(dp);//阻塞式的
//System.out.println(new String(buf, 0, dp.getLength()));
System.out.println(dis.readLong());
import java.net.*;
import java.io.*;
public class TestUDPClient {
public static void main(String[] args) throws Exception{
//向服务器端传一个long类型数字
long n = 10000;
ByteArrayOutputStream baos =
new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeLong(n);
byte [] buf = baos.toByteArray();
//byte [] buf = (new String("hello")).getBytes();
DatagramPacket dp = new DatagramPacket(buf, buf.length, new InetSocketAddress("127.0.0.1",5678));
DatagramSocket ds = new DatagramSocket(9999);
ds.send(dp);
ds.close();
摘自 Yours风之恋中国领先的IT技术网站
51CTO旗下网站
Java Socket编程----通信是这样炼成的
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。下面就让我们一起揭开Socket的神秘面纱。
作者:rocomp来源:博客园| 10:06
Java最初是作为网络编程语言出现的,其对网络提供了高度的支持,使得客户端和服务器的沟通变成了现实,而在网络编程中,使用最多的就是Socket。像大家熟悉的QQ、MSN都使用了Socket相关的技术。下面就让我们一起揭开Socket的神秘面纱。
Socket编程
一、网络基础知识(参考计算机网络)
关于计算机网络部分可以参考相关博客:
TCP/IP协议栈及OSI参考模型详解》
1、两台计算机间进行通讯需要以下三个条件:
IP地址、协议、端口号
2、TCP/IP协议:
是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也成TCP/IP协议族、或TCP/IP协议栈
TCP:Transmission Control Protocol 传输控制协议
IP:Internet Protocol 互联网协议
3、TCP/IP五层模型
应用层:HTTP、FTP、SMTP、Telnet等
传输层:TCP/IP
数据链路层:
物理层:网线、双绞线、网卡等
为实现网络中不同计算机之间的通信,每台计算机都必须有一个唯一的标识---IP地址。
32位二进制
区分一台主机的多个不同应用程序,端口号范围为0-65535,其中0-1023位为系统保留。
如:HTTP:80FTP:21 Telnet:23
IP地址+端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP的基础
6、Socket套接字:
网络上具有唯一标识的IP地址和端口组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输&&&&&
7、Java中的网络支持
针对网络通信的不同层次,Java提供了不同的API,其提供的网络功能有四大类:
InetAddress:用于标识网络上的硬件资源,主要是IP地址
URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据
Sockets:使用TCP协议实现的网络通信Socket相关的类
Datagram:使用UDP协议,将数据保存在用户数据报中,通过网络进行通信。
二、InetAddress
InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。
该类没有构造方法&&&&&&&
&InetAddress&address&=InetAddress.getLocalHost();&address.getHostName();&address.getHostAddress();&byte[]&bytes&=&address.getAddress();&&&InetAddress&address2&=InetAddress.getByName(&其他主机名&);&InetAddress&address3&=InetAddress.getByName(&IP地址&);&
&三、URL类
&URL&baidu&=new&URL(&&);&URL&url&=new&URL(baidu,&/index.html?username=tom#test&);&url.getProtocol();&url.getHost();&url.getPort();&url.getPath();&url.getFile();&url.getRef();&url.getQuery();&
2、使用URL读取网页内容
通过URL对象的openStream()方法可以得到指定资源的输入流,通过流能够读取或访问网页上的资源&
&&URL&url&=new&URL(&&);&InputStream&is&=&url.openStream();&InputStreamReader&isr&=newInputStreamReader(is,&UTF-8&);&BufferedReader&br&=newBufferedReader(isr);&String&data&=&br.readLine();&while(data!=null){&System.out.println(data);&data&=&br.readerLine();&}&br.close();&isr.colose();&is.close();&
四、TCP编程
1、TCP协议是面向连接的、可靠的、有序的、以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据的通道,在连接中进行大量数据的传输,效率会稍低
2、Java中基于TCP协议实现网络通信的类
客户端的Socket类
服务器端的ServerSocket类
3、Socket通信的步骤
① 创建ServerSocket和Socket
② 打开连接到Socket的输入/输出流
③ 按照协议对Socket进行读/写操作
④ 关闭输入输出流、关闭Socket
4、服务器端:
① 创建ServerSocket对象,绑定监听端口
② 通过accept()方法监听客户端请求
③ 连接建立后,通过输入流读取客户端发送的请求信息
④ 通过输出流向客户端发送乡音信息
⑤ 关闭相关资源
&&&&ServerSocket&serverSocket&=newServerSocket(10086);&&Socket&socket&=&serverSocket.accept();&&InputStream&is&=&socket.getInputStream();&InputStreamReader&isr&=newInputStreamReader(is);&BufferedReader&br&=newBufferedReader(isr);&String&info&=null;&while((info=br.readLine())!=null){&System.out.println(&我是服务器,客户端说:&+info);&}&socket.shutdownInput();&&OutputStream&os&=&socket.getOutputStream();&PrintWriter&pw&=&new&PrintWriter(os);&pw.write(&欢迎您!&);&pw.flush();&&&&pw.close();&os.close();&br.close();&isr.close();&is.close();&socket.close();&serverSocket.close();&
&5、客户端:
① 创建Socket对象,指明需要连接的服务器的地址和端口号
② 连接建立后,通过输出流想服务器端发送请求信息
③ 通过输入流获取服务器响应的信息
④ 关闭响应资源
&&Socket&socket&=newSocket(&localhost&,10086);&&OutputStream&os&=&socket.getOutputStream();&PrintWriter&pw&=newPrintWriter(os);&pw.write(&用户名:admin;密码:123&);&pw.flush();&socket.shutdownOutput();&&InputStream&is&=&socket.getInputStream();&BufferedReader&br&=&new&BufferedReader(new&InputStreamReader(is));&String&info&=&null;&while((info=br.readLine())!null){&&System.out.println(&我是客户端,服务器说:&+info);&}&&&br.close();&is.close();&pw.close();&os.close();&socket.close();&
6、应用多线程实现服务器与多客户端之间的通信
① 服务器端创建ServerSocket,循环调用accept()等待客户端连接
② 客户端创建一个socket并请求和服务器端连接
③ 服务器端接受苦读段请求,创建socket与该客户建立专线连接
④ 建立连接的两个socket在一个单独的线程上对话
⑤ 服务器端继续等待新的连接&&&&&&&
&&Socket&socket&=null;&&public&serverThread(Socket&socket){&this.socket&=&&}&&publicvoid&run(){&&}&&&&ServerSocket&serverSocket&=newServerSocket(10086);&Socket&socket&=null;&int&count&=0;&while(true){&socket&=&serverScoket.accept();&ServerThread&serverThread&=newServerThread(socket);&&serverThread.start();&&count++;&System.out.println(&客户端连接的数量:&+count);&}&
五、UDP编程
UDP协议(用户数据报协议)是无连接的、不可靠的、无序的,速度快
进行数据传输时,首先将要传输的数据定义成数据报(Datagram),大小限制在64k,在数据报中指明数据索要达到的Socket(主机地址和端口号),然后再将数据报发送出去
DatagramPacket类:表示数据报包
DatagramSocket类:进行端到端通信的类
1、服务器端实现步骤
① 创建DatagramSocket,指定端口号
② 创建DatagramPacket
③ 接受客户端发送的数据信息
④ 读取数据
&&DatagramSocket&socket&=new&datagramSocket(10010);&&byte[]&data&=newbyte[1024];&DatagramPacket&packet&=newDatagramPacket(data,data.length);&&socket.receive(packet);&&String&info&=newString(data,o,data.length);&System.out.println(&我是服务器,客户端告诉我&+info);&&&&&&InetAddress&address&=&packet.getAddress();&int&port&=&packet.getPort();&byte[]&data2&=&&欢迎您!&.geyBytes();&&DatagramPacket&packet2&=&new&DatagramPacket(data2,data2.length,address,port);&&socket.send(packet2);&&socket.close();&
2、客户端实现步骤
① 定义发送信息
② 创建DatagramPacket,包含将要发送的信息
③ 创建DatagramSocket
④ 发送数据
&&InetAddress&address&=InetAddress.getByName(&localhost&);&int&port&=10010;&byte[]&data&=&用户名:密码:123&.getBytes();&&DatagramPacket&packet&=&newDatagramPacket(data,data,length,address,port);&&DatagramSocket&socket&=newDatagramSocket();&&socket.send(packet);&&&&&&byte[]&data2&=&new&byte[1024];&DatagramPacket&packet2&=&new&DatagramPacket(data2,data2.length);&&socket.receive(packet2);&String&raply&=&new&String(data2,0,packet2.getLenth());&System.out.println(&我是客户端,服务器说:&+reply);&&socket.close();&
六、注意问题:
&1、多线程的优先级问题:
根据实际的经验,适当的降低优先级,否侧可能会有程序运行效率低的情况
&2、是否关闭输出流和输入流:
对于同一个socket,如果关闭了输出流,则与该输出流关联的socket也会被关闭,所以一般不用关闭流,直接关闭socket即可
&3、使用TCP通信传输对象,IO中序列化部分
&4、socket编程传递文件,IO流部分
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
原创头条原创头条头条
24H热文一周话题本月最赞
讲师:1人学习过
讲师:27人学习过
讲师:0人学习过
精选博文论坛热帖下载排行
本书是数据库系统方面的经典教材之一。国际上许多著名大学包括斯坦福大学、耶鲁大学、得克萨斯大学、康奈尔大学、伊利诺伊大学、印度理工学...
订阅51CTO邮刊您现在的位置:&&>>&&>>&&>>&&>>&正文
Java中的TCP/UDP网络通信编程
  127.0.0.1是回路地址,用于,相当于localhost本机地址,没有网卡,不设DNS都可以访问.
  端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口.
  网络应用中基本上都是TCP(Transmission Control Protocol传输控制)和UDP(User Datagram Protocol用户数据报),TCP是面向连接的通信,UDP是无连接的通信协议.
  Socket连接套接字,分别为TCP和UDP提供了相应的类,TCP是java.net.ServerSocket(用于端)和java.net.Socket(用于客户端);UDP是java.net.DatagramSocket.
  1,编写UDP网络程序
  1.1,DatagramSocket
  DatagramSocket有如下构造方法:
  1,DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。
  2,DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
  3,DatagramSocket(int port, InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.
  如果在创建DatagramSocket对象时,没有指定网卡的IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.
  发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.
  发送数据使用DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.
  1.2,DatagramPacket
  DatagramPacket类有如下构造方法:
  1,DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为length的数据包。
  2,DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。
  接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.
  1.3,InetAddress
  Java中对IP地址进行包装的类,
  DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.
  1.4,UDP程序例子
  发送程序:
  import java.net.DatagramP
  import java.net.DatagramS
  import java.net.InetA
  public class UdpSend {
  public static void main(String[] args) throws Exception {
  DatagramSocket ds = new DatagramSocket();
  String str = "hello , world!";
  DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.105"),3000);
  ds.send(dp);
  ds.close(); //关闭连接
  接收程序:
  import java.net.DatagramP
  import java.net.DatagramS
  public class UdpRecv {
  public static void main(String[] args) throws Exception {
  DatagramSocket ds = new DatagramSocket(3000);
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf,buf.length);
  ds.receive(dp);
  String str = new String(dp.getData(),0,dp.getLength());
  System.out.println(str);
  System.out.println("IP:" + dp.getAddress().getHostAddress() + ",PORT:" + dp.getPort());
  ds.close();
  要先运行接收程序,再运行发送程序.如果接收程序没有接收到数据,则会一直阻塞,接收到数据后才会关闭程序.如果网络上没有数据发送过来,接收程序也没有阻塞,通常都是使用了一个已经被占用的端口.
【责编:coco】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 认证培训
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 社区讨论
 博客论点
 频道精选
 Java 频道导航}

我要回帖

更多关于 eclipse编写java程序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信