java网络编程


     一、了解网络基础知识
    1、TCP/IP协议
      TCP/IP协议是网络通信技术事实上的一个标准,TCP/IP协议是一组协议的总称,它包括了HTTP、SMTP、TCP、UDP、IP等协议,所以也将其称为TCP/IP协议簇。在TCP\IP协议体系结构中,这些协议分为4个层次,从上往下依次为应用层、传输层、互联层、网络接口层。
    应用层:有多种协议,几乎包括互联网的所有应用。如用于www服务的HTTP协议。
    传输层:有多种协议,每种协议提供不同的服务,主要是UDP和TCP协议。
    互联层:由多个协议组成,这些协议互相合作,共同完成互联层的功能,其中最主要的协议是IP协议。
    网络接口层:主要是一些硬件设施,如网卡、光纤、等。还包括一些网络协议,如以太网。这一层是网络传输的基础。
   2、IP协议
    IP协议(Internet Protoclo ,互联网协议)提供无连接的传输服务,它的功能是把数据发送到目标主机,IP协议传输的数据单元称为数据包。每个IP数据包都包含了数据的源IP地址和目的IP地址。
   3、TCP协议(Transmission Control Protocol)传输控制协议
    传输层主要的两种协议之一,另一种协议是UDP协议。
   TCP协议的特点:
  (1)、TCP协议是一种面向连接的、可靠的协议。
  (2)、建立连接,形成传输数据的通道。
  (3)、可进行大量数据的传输。
  (4)、因为必须建立连接,效率会稍低
  4、UDP协议:(User Datagram Protocol)用户数据报协议,是一种不可靠、无连接的服务,它直接向网络发送数据给一台主机或多台主机,而不需要确认数据是否送达。该协议主要用于一次性传输少量数据。不仅用于点到点的通信。也用于一对多的通信。
   UDP协议特点:
  (1)、将数据源及目的信息封装成数据报,不需要连接。
   (2)、每个数据报的大小限制在64k 以内
   (3)、面向无连接,是不可靠协议
  (4)、速度快
 
  5、套接字(Socket)
   由IP地址和端口号组成,它唯一标识了网络上运行的通信进程。是为网络服务提供的一种机制,通信的两端都有Socket,数据在两个Socket间通信。
  6、网络通信的三要素
   IP地址:网络中设备的标识
   端口号:用于标记进程的逻辑地址,不同进程的标识。是一个16位的正整数,0-1023已被系统占用,用户能够使用的端口号为1024到65535.
   传输协议:即通信的规则,常见协议为TCP、IP
 
  二、用UDP进行网络编程
   UDP开发主要使用的类:
    1、DatagramSocket类:此类表示用来发送和接收数据报包的套接字
       DatagramSocket的常用方法
       DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。
       DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。 
       void receive(DatagramPacket p) 从此套接字接收数据报包。
       void send(DatagramPacket p)    从此套接字发送数据报包。

    
   2、DatagramPacket类:数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
      DatagramPacket的常用方法:
      DatagramPacket(byte[] buf,int length)  构造 DatagramPacket,用来接收长度为 length 的数据包。
      DatagramPcket(byte[] buf,int lenght,InetAddress address,int port)构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
      byte[] getData() 获得数据报包中的数据
      void setData(byte[] buf)  设置数据报包中的数据
   3、下面是一个使用UDP协议进行网络上发送数据和接收数据的小实例
    (1)、数据接收端

    

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ReciveSocket {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		int port=2000;
		            
		DatagramSocket ds=null;
		try {
			//给这个网络应用程序 定义  一个数字标识
			 ds=new DatagramSocket(port);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//2.定义一个数据报封包,用来接收数据
		while(true){
			DatagramPacket dp=null;
			byte [] buf=new byte[1024];
			dp=new DatagramPacket(buf,buf.length);
			try {
				ds.receive(dp);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			String data=new String(dp.getData(),0,dp.getLength());
			System.out.println(data);
			System.out.println(dp.getPort());
			System.out.println(dp.getAddress().getHostName());
               }
           ds.close();//关闭资源
           
	}
}

 

    (2)、数据发送端


 

import java.io.*;
import java.net.*;

/**
 * 网络编程学习,发送端
 * @author
 *
 */
public class SendSocket {

	/**
	 * @param args
	 */
	public static void main(String[] args)throws IOException{
		int port=2000;//端口号
		// TODO Auto-generated method stub
		//1.建立一个UDPSocket服务\
		DatagramSocket ds=null;
		 try {
			ds=new DatagramSocket(2004);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//2.添加数据,并封装成数据报包
                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
                String str=null;
                while((str=br.readLine())!=null)
                {
                   if(str.equals("886"))
                         break;
		byte[] buf=str.getBytes();
		DatagramPacket dp=null;
		try {
			dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.255"),2000);
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//3.发送数据 包
		try {
			ds.send(dp);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
                }
		ds.close();//关闭资源
	}
}


  三、使用TCP协议进行网络编程
   1、Socket类:此类实现客户端套接字,套接字是两台机器间通信的端点。该对象建立连接时,就可以去连接指定的主机,因为TCP是建立连接的,所以在建立Socket服务时,就要有服务端存在,并连接成功,形成通路后,才能在该Socket的数据通道进行数据的传输。
  (1)、常用方法:
     Socket(String host,int port)  创建一个流套接字并将其连接到指定主机上的指定端口号。
   InputStream getInputStream()   返回此套接字的输入流。
   OutputStream getOutputStream() 返回此套接字的输出流。
   void close()                   关闭此套接字。
   2、ServerSocket类:此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果
  主要方法:
  ServerSocket(int port) 构造方法,创建绑定到特定端口的服务器套接字。
  Socket accept() 侦听并接受到此客户端套接字的连接。连接成功后返回一个Socket客户端套接字,这个Socket就是客户端的,使用它来与客户进行通信。形成服务器端与服务器一对多的关系。
  3、InetAddress类:封装了IP地址等信息。
  4、TCP编程客户端的开发步骤
 (1)、创建Socket,并与服务器端建立连接
    Socket client=new  Socket(InetAddress address, int port);
  (2)、打开连接到Socket的输入输出流
   InputStream is=client.getInputStream();
  (3)、对数据进行操作
 (4)、关闭socket;
  5、TCP编程服务器端的开发步骤
  (1)、创建ServerSocket,并指定一个端口进行监听
    ServerSocket ss=new ServerSocket(int port)
   (2)、接收客户端的连接
    Socket clientSocket=ss.accept();
   (3)、进行数据传输
  (4)、关闭客户端socket
  6、下面是一个小例子演示使用TCP协议进行网络通信
  建立客户端:


 

package itcast.Tcpsocket.stu;

import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.io.*;
/*
 * 定义 一个客户端,发送并接收数据
 *
 */
public class TcpClient {

 public static void main(String[] args) {
  Socket s=null;
  OutputStream out=null;
  InputStream in=null;
   try {
    s=new Socket("192.168.1.100",10004);
    out=s.getOutputStream();
    byte[] b=new byte[1024];
    out.write("我是客户端,你好!".getBytes());
    in=s.getInputStream();
    int len=in.read(b);
    System.out.println(new String(b,0,len));
   } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
 }
}

  建立服务器端:   

package itcast.Tcpsocket.stu;
import java.net.*;
import java.io.*;
/*
 * 定义一个服务器端,先接收数据,收到 后在发给客户端一个数据。
 *
 */
public class TcpServer2 {
 
 public static void main(String[] args) throws UnknownHostException {
  InetAddress ia=InetAddress.getLocalHost();
  System.out.println(ia.getHostAddress());
  ServerSocket ss=null;
  Socket s=null;
  InputStream in=null;
  OutputStream out=null;
  try {
    ss=new ServerSocket(10004);
   s=ss.accept();
   in=s.getInputStream();
   byte[] b=new byte[1024];
   int len=in.read(b);
   System.out.println(new String(b,0,len));
   out=s.getOutputStream();
   out.write("我是服务器端:我已收到你的消息!".getBytes());
   s.close();
   
   
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值