Socket编程及Java实现.doc_第1页
Socket编程及Java实现.doc_第2页
Socket编程及Java实现.doc_第3页
Socket编程及Java实现.doc_第4页
Socket编程及Java实现.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java SOCKET通信资料Lemon网络通信概述Java是一种可用于进行网络编程的语言,它提供了两种功能强大的网络支持机制:URL访问网络资源的类和用Socket通讯的类,来满足不同的要求。一是URL用于访问Internet网上资源的应用;另一种是针对client/server(客户端/服务器)模式的应用以及实现某些特殊的协议的应用,它的通讯过程是基于TCP/IP协议中传输层接口socket实现的。本文想简单的介绍一下Socket编程的Java实现方法。TCP通信概述客户基于服务器之间使用的大部分通讯组件都是基于socket接口来实现的。Socket是两个程序之间进行双向数据传输的网络通讯端点,有一个地址和一个端口号来标识。每个服务程序在提供服务时都要在一个端口进行,而想使用该服务的客户机也必须连接该端口。Socket因为是基于传输层,所以它是比较原始的通讯协议机制。通过Socket的数据表现形式为字节流信息,因此通讯双方要想完成某项具体的应用则必须按双方约定的方式进行数据的格式化和解释,我们可以看出使用Socket编程比较麻烦,但是它具有更强的灵活性和更广泛的使用领域。客户机/服务器工作的模式到底是什么样的呢?好,下面我想结合一张图来介绍一下它们的工作模式。服务器端:InputStream-输入流,是用来接收来自客户端的数据。OutputStream-输出流,是服务器向客户端发送的数据。客户端:InputStream-输入流,是用来接收来自服务端的数据。OutputStream-输出流,是客户端向服务器端发送的数据。那么Java应用程序是如何实现上述过程的呢?包中有两个类Socket和ServerSocket,分别用于在客户机和服务器上创建Socket通讯。l 客户端让我们先来看看客户段程序编写的流程:1、 首先调用Socket类的构造函数,以服务器的指定的IP地址或指定的主机名和指定的端口号为参数,创建一个Socket流,在创建Socket流的过程中包含了向服务器请求建立通讯连接的过程实现。2、 建立了客户端通讯Socket后。就可以使用Socket的方法getInputStream()和getOutputStream()来创建输入/输出流。这样,使用Socket类后,网络输入输出也转化为使用流对象的过程。3、 使用输入输出流对象的相应方法读写字节流数据,因为流连接着通讯所用的Socket,Socket又是和服务器端建立连接的一个端点,因此数据将通过连接从服务器得到或发向服务器。这时我们就可以对字节流数据按客户端和服务器之间的协议进行处理,完成双方的通讯任务。4、 待通讯任务完毕后,我们用流对象的close()方法来关闭用于网络通讯的输入输出流,在用Socket对象的close()方法来关闭Socket。下面,我想通过一个简单的例子来进一步介绍一下客户端程序的编写代码一:package test;import java.io.DataInputStream;import java.io.OutputStream;import .InetAddress;import .Socket;public class SocketClient public static void main(String args) try Socket clientSocket = new Socket(InetAddress.getByName(), 5000);/ 创建一个流Socket并与主机mice上的端口5000相连接OutputStream output = clientSocket.getOutputStream();/ 向此Socket写入字节的一个输出流DataInputStream input = new DataInputStream(clientSocket.getInputStream();/ 创建新的数据输入流以便从指定的输入流中读出数据int c;String response;while (c = System.in.read() != -1)/ 从屏幕上接受输入的字符串,并且分解成一个个字符output.write(byte) c);if (c = n)/ 如果字符为回车,则输出字符串缓冲output.flush();response = input.readLine();System.out.println(Communication: + response);output.close();input.close();clientSocket.close(); catch (Exception e)System.out.println(ffffffffff);这个程序是一个非常的简单的数据通讯的例子,程序先创建了一个Socket并和主机mice上的端口5000相连接,然后打开输入输出流,接着程序从标准输入接收字符并写入流中,每写满一行(以用户键入回车为标志),就把缓冲区中的字符串送往mice上的服务器端程序进行处理,等待服务器端的应答。input.readLine()方法调用将导致程序停滞直到收到应答信息,程序将一直重复这个过程,直到用户输入中止符。最后程序要关闭socket输入输出流,在关闭socket和服务器端的连接。l 服务端:如何使用Java编写客户端的Socket接口程序,下面我也想简要的谈一谈服务器端的Socket接口程序的Java实现方法,其过程如下所述:1、 首先调用ServerSocket类以某个端口号为参数,创建一个ServerSocket对象,即是服务器端的服务程序在该指定端口监听的Socket。2、 服务器端程序使用ServerSocket对象的accept()方法,接收来自客户机程序的连接请求,此时服务器端将一直保持停滞状态,直到收到客户端发来的连接请求,此时该方法将返回一个新建的Socket类的实例,代表和客户机建立的通讯链路在服务程序内的通讯端点。如果采用Java的多线程编程方法,可以实现并发服务器,继续监听来自其他客户的连接请求。3、 使用新建的Socket对象创建输入、输出流对象。4、 使用流对象的方法完成和客户端的数据传输,按约定协议识别并处理来自客户端的请求数据,并把处理的结果返回给客户端。5、 客户端工作完毕后,则服务器端程序关闭和客户端通讯的流和通讯的Socket。6、 在服务器程序运行结束之间,应当关闭用来监听的Socket.下面让我们来看一个服务器端的程序的Java实现:代码二:package test;import java.io.PrintStream;import .*;import java.io.*;public class SocketServer /* * param args */public static void main(String args) throws Exceptionboolean flag=true;/设置标志位为真Socket client=null;/创建Socket client以接收来自客户端的请求String inputLine; ServerSocket serverSocket =new ServerSocket (5000);/以端口5000创建一个服务器SocketSystem.out.println(服务器在端口5000上监听);/也可以使用serverSocket.getLocalPort()来获得端口号while(flag) client=serverSocket.accept();/监听并接受与此Socket的连接,该方法会阻塞直到有一个连接产生DataInputStream input=new DataInputStream(new BufferedInputStream(client.getInputStream(); PrintStream output=new PrintStream(new BufferedOutputStream(client.getOutputStream(); while ( inputLine= input.readLine()!=null) System.out.println(111111111 + inputLine);if(inputLine.equals(quit) flag=false;break; output.println(inputLine);output.flush(); output.close();input.close(); client.close();serverSocket.close();利用socket通信实现文件传输l 服务器端传输代码package com.workit.partnet;import java.io.*; import .*; public class FileServer public static void main(String args)throws Exception /创建文件流用来读取文件中的数据 File file=new File(lemon.bat); FileInputStream fis=new FileInputStream(file); /创建网络服务器接受客户请求 ServerSocket ss=new ServerSocket(3108); Socket client=ss.accept(); /创建网络输出流并提供数据包装器 OutputStream netOut=client.getOutputStream(); DataOutputStream doc=new DataOutputStream(new BufferedOutputStream(netOut); /创建文件读取缓冲区 byte buf=new byte2048; int num=fis.read(buf); while(num!=(-1)/是否读完文件 doc.write(buf,0,num);/把文件数据写出网络缓冲区 doc.flush();/刷新缓冲区把数据写往客户端 num=fis.read(buf);/继续从文件中读取数据 fis.close(); doc.close(); l 客户端代码:package com.workit.partnet;import java.io.*; public class FileClient public static void main(String args)throws Exception /使用本地文件系统接受网络数据并存为新文件 File file=new File(newlemon.bat); file.createNewFile(); RandomAccessFile raf=new RandomAccessFile(file,rw); / 通过Socket连接文件服务器 Socket server=new Socket(InetAddress.getLocalHost(),3108); /创建网络接受流接受服务器文件数据 InputStream netIn=server.getInputStream(); InputStream in=new DataInputStream(new BufferedInputStream(netIn); /创建缓冲区缓冲网络数据 byte buf=new byte2048; int num=in.read(buf); while(num!=(-1)/是否读完所有数据 raf.write(buf,0,num);/将数据写往文件 raf.skipBytes(num);/顺序写文件字节 num=in.read(buf);/继续从网络中读取文件 in.close(); raf.close(); UDP通信部分l 接收端package test;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .SocketException;public class UDPResive /* * param args */public static void main(String args) / TODO Auto-generated method stubtry DatagramSocket ds = new DatagramSocket(50000);byte buffer = new byte1024;DatagramPacket dp = new DatagramPacket(buffer, 1024);try ds.receive(dp);String v_revstr = new String(buffer,0,dp.getLength();System.out.println(v_revstr);System.out.println(端口号位: + dp.getPort() + ,发送端ip地址为: + dp.getAddress();ds.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (SocketException e) / TODO Auto-generated catch blocke.printStackTrace();l 发送端package test;import java.io.IOException;import .DatagramPacket;import .DatagramSocket;import .InetAddress;import .SocketException;import .UnknownHostException;public class UDPSend /* * param args */public static void main(String args) / TODO Auto-generated method stubtry DatagramSocket ds = new DatagramSocket();String strinfo = 沃克IT教育欢迎您!网址:;ds.send(new DatagramPacket(strinfo.getBytes(), strinfo.getBytes().length,InetAddress.getByName(03),50000);ds.close(); catch (SocketException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();项目案例利用udp编写聊天器package jecttest;import java.awt.*import java.io.IOException;import .*;/* * deprecated 利用UDP技术实现聊天器 * author lemon * since 2011-1-20 * version 1.0 */public class Chat extends Frame List list = new List(6);/定义显示聊天信息列表框TextField tfip = new TextField(15);/定义ip地址文本框TextField tfdata = new TextField(20);/定义发送信息的文本框List listuser = new List(10);/定义upd通信DatagramSocket ds;public Chat() throws HeadlessException / TODO Auto-generated constructor stubtry ds = new DatagramSocket(50000); catch (SocketException e1) / TODO Auto-generated catch blocke1.printStackTrace();Panel plist = new Panel();plist.setBackground(Color.RED);/plist.setSize(150, 350);plist.setLayout(new BorderLayout();/plist.resize(150, 350);plist.setPreferredSize(new Dimension(250, 350);this.add(plist,North);plist.add(list,West);plist.add(listuser,East);Panel p = new Panel();p.setPreferredSize(new Dimension(250, 350);this.add(p,South);p.setLayout(new BorderLayout();p.add(tfip,West);p.add(tfdata,East);new Thread(new Runnable() Overridepublic void run() / TODO Auto-generated method stub/DatagramSocket ds = new DatagramSocket(50000);try byte buffer = new byte1024;DatagramPacket dp = new DatagramPacket(buffer, 1024);while(true)try ds.receive(dp);String v_revstr = new String(buffer,0,dp.getLength();System.out.println(v_revstr);v_revstr += t + dp.getAddress().toString();list.add(v_revstr ,0);/ds.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (Exception e) / TODO Auto-generated catch blockif(!ds.isClosed()e.printStackTrace();).start();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论