网络编程  Datagram与Socket两种方式编程实例说明

网络编程三大要素

  IP地址

    网络中设备的标识

    不易记,可用主机名

    本地环回地址127.0.0.1 主机号 localhost

    分类

      A类地址

        范围0--127,o 是保留地址  子网掩码225.0.0.0

      B类地址

        128--191  子网掩码225225.0.0

      C类地址

        192--223 子网掩码225225.225.0

      D类地址

        224--239

          多点广播

      E类地址

        240--254

  端口号

    用于标识进程的逻辑地址,不同进程的标识

    有效端口,0--65535  0-1024系统使用或保留口

  传输协议

    传输协议用来从一个端口向别一个端口传送信息,因而允许应用程序之间进行通信。TCP是面向连接的协议,UDP是非连接的传输协议

网络通讯方式TCP/UDP

  TCP传输控制协议的特点

    建立 连接,形成传输数据的通道

    在连接中进行大数据量的传输

    通过三次握手是可靠的

    因为要建立连接,效率会稍低

  UDP用户数据包协议

    将数据及源和目的封装成数据包中,不需要建立连接

    每个数据包的大小限制在64K

    因为无连接,所以不可靠

    不需要建立 连接,速度快

HttpURLConnection类的使用

  构造方法

    protected  HttpURLConnection(URL u) 

          HttpURLConnection 的构造方法。 

  常用方法

    abstract  void disconnect() 

          指示近期服务器不太可能有其他请求。 

     String getRequestMethod() 

          获取请求方法。 

    Subtopic

    Subtopic

UDP程序开发步骤

  创建UDP的发送方

    创建一DatagramSocket,其中包含了发送方的端口号

    创建一个DatagramPacket,用于存发送的消息,接收方的端口和IP

    发送数据ds.send()

    关闭资源

  创建UDP的接收方

    创建一个DatagramSocket,其中制定了接收方的端口号

    创建一个DatagramPacket,用于存发送方发送的数据

    接收数据ds.receive();

    关闭资源

客户端、服务端C/S编程模式 TCP

  TCP客户端程序开发的步骤

    创建Socket

    取得IO

    对IO流进行读写操作

    关IO流

    关Socket

  TCP服务器程序开发的步骤

    创建一ServerSocket

    从ServerSocket接受客户端连接请求

    创建一个服务线程处理新的连接

    在服务线程中,从Socket中取得IO

    关闭IO

    关闭Socket

Ip地址处理

JavaIP地址的处理类InetAddress 常用方法如下:

返回四个字节形式的原始地址:

Byte[] getAddress()

在给定主机名的情况下,根据系统上配置的名称返回其IP地址所组成的数组

Static InetAdderss[] getAllByName(String host)

获取此ip地址的主机名

String getHostName()

返回本地主机的ip地址

Static InetAddress getLocalHost()

String getHostAddress()

以文本形式返回IP地址字符串

Static  InetAddress getByName(String host)

在给定主机名的情况下确定主机的ip地址

一个InetAddress类的实例代表一个IP地址,创建它的实例可用下面的方法实现

InetAddress addr=InetAddress.getByName(String host)

InetAddress addr=InetAddress.getAllByName(String host)

InetAddress addr=InetAddress.getHostAddress()

InetAddress addr=InetAddress.getByAddress(byte[] addr)

InetAddress addr=InetAddress.getByAddress(String host,byte[] addr)

显示主机所有的IP地址

读者可在命令行中输入主机名,如果不输入主机名,返回本机所有的ip地址

Public class IPDemo{

Public static  void main(String args[]) throws UnknownHstException{

InetAddress  addrlist[];

If(args.length<1){

InetAddress thisaddr=InetAddress.getLocalHost();

Addrlist=InetAddress.getAllByName(thisaddr.getHostName());

}else {

  addrlist=InetAddress.getAllByName(args[0]);

}

   for(int i=0;i<addrlist.length;i++){

  System.out.print(addrlist[i].getHostName()+:);

  System.out.print(addrlist[i].getHostAddress());

}

}

DatagramSocket编程例子:

public class UDPClient {

/**

 * 客户端

 * @throws IOException 

 */

public static void main(String[] args) throws IOException {

    DatagramSocket client=new DatagramSocket();//创建客户发送端

    String sendStr="hello,word";

    byte[] sendBuf;

    sendBuf=sendStr.getBytes();

    InetAddress addr=InetAddress.getByName("192.168.1.115");

    int port=5050;

    DatagramPacket sendPacket=new DatagramPacket(sendBuf,sendBuf.length,addr,port);

    client.send(sendPacket);

    client.close();

}

}

----------------------------------

public class UDPServer {

/**

 *  服务端

 * @throws IOException 

 */

public static void main(String[] args) throws IOException {

    DatagramSocket server=new DatagramSocket(5050);

    byte[] recvBuf=new byte[100];

    DatagramPacket  recvPacket=new DatagramPacket(recvBuf,recvBuf.length);//接收包的数据包

    //接收客户端消息

    server.receive(recvPacket);

    String recvStr=new String(recvPacket.getData(),0,recvPacket.getLength());

    System.out.println("接收客户端发送的消息"+recvStr);

server.close();

}

}

public class HttpURLConnectionDemo {

/**

 *本类的作用是通过HTTP协议向服务器发送请求,并可以获得取务器发回的数据。通过openConnection方法获得实例。

 *创建一个URL实例与服务器建立联接,调用URL对象中openConnection方法打开当前连接。其次创建InputStream 和 BufferedReader读写流,循环进行

 *读写,最后关。

 * @throws IOException 

 */

public static void main(String[] args) throws IOException {

URL url=new URL("www.baidu.com");

 HttpURLConnectionconn=(HttpURLConnection)url.openConnection();//打开连接

 InputStream in=conn.getInputStream();//获取服务器的输入流;

 BufferedReader br=new BufferedReader(new InputStreamReader(in));

 String str="";

 while((str=br.readLine())!=null){

 System.out.println(str);

 }

 conn.disconnect();

 

 

 

}

}

利用SOCKET编程实例

利用socket创建客户端

public class TcpCliectTest {//创建一个客户端

public static void main(String[] args) throws IOException {

     ArrayList<String> al=new ArrayList<String>();

     Socket s=null;

     BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));

     //从键盘输入的字节转成字符流,通过缓冲读取,读取字符不需要缓冲区

     System.out.println(" 请输入要上传的文件路径");

     String line=null;//要上传的文件路径 line

     while((line=bufr.readLine())!=null){

     if("over".equals(line))//结束标记,

     break;

     al.add(line); //把文件路径放到集合中

     }

    Iterator<String> it=al.iterator();

    while(it.hasNext()){

    String site=it.next();//集合中存的是 site信息.

    s=new Socket(InetAddress.getByName("192.168.1.108"),9999);//获得接收端IP地址名及端口号,建一个SOCKET通道。

    new Thread(new CliThre(s,site)).start();//将s,site传到一个线程中

    }

}

}

利用socket创建服务器端

public class TcpServerTest {

/* *服务器端

 */

public static void main(String[] args) throws IOException {

ServerSocket ss=new ServerSocket(1397);

while(true){//无限循环

Socket s=ss.accept();// 获取客户端发过来的对象。为其开启一个新的线程。

new Thread(new ServThre(s)).start();

}

}

}

通过网络上传图片的例子:

//客户端

public class CliThre implements Runnable {//实现多线程接口对IO流进行读写操作

private Socket s;

private String site;

CliThre(Socket s,String site){

this.s=s;

this.site=site;

}

@Override

public void run() {

try {

BufferedInputStream bis=new BufferedInputStream(new FileInputStream(site));//文件读取流,读 site站点中的文件

BufferedOutputStream buOut=new BufferedOutputStream(s.getOutputStream());//获取到Socket中的读取流

BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));//获取到Socket中的输出流

byte[] buf=new byte[1024];//定义一个字节数组

int len;

while((len=bis.read(buf))!=-1){//不断从指定文件中读取并将数据写入到服务器端,因为建立了socket

buOut.write(buf,0,len);

buOut.flush();

}

s.shutdownOutput();//告诉服务器写完了。

String info=bufr.readLine();//读取服务器端反回的信息。

System.out.println(info);

        bis.close();//关流操作

        s.close();

catch (IOException e) {

System.out.println(e.toString());

}

}

}

服务器端:

public class ServThre implements Runnable {

private Socket s;

ServThre(Socket s){

this.s=s;

}

private static int count=1;

@Override

public void run() {

   String ip=s.getInetAddress().getHostAddress();

   //猎取客户端的IP并打印

   System.out.println(s.getInetAddress().getHostAddress()+"正在连接");

   try {

BufferedInputStream  bufin=new BufferedInputStream(s.getInputStream());//获取 socket中的读取流

BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("d:\\photos\\"+ip+"("+count+")"+".jpg"));

PrintWriter pw=new PrintWriter(s.getOutputStream(),true);//获取 socket输出流

byte[] buf=new byte[1024];

int len;

while((len=bufin.read(buf))!=-1){

bos.write(buf,0,len);

bos.flush();

}

pw.print("图片上传成功");

bos.close();

s.close();

catch (IOException e) {

e.printStackTrace();

}

   }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值