【黑马程序员】网络编程

来源:互联网 发布:淘宝网严重违规节点48 编辑:程序博客网 时间:2024/05/18 09:22

---------------------- android培训、java培训、期待与您交流! ----------------------

1.TCP,传输控制协议(Transmission Control Protocol),是面向连接的通信协议。

2.UDP,用户数据报协议(User Datagram Protocol),是无连接通信协议。

3.Socket是网络驱动层提供给应用程序编程的接口和一种机制。

4.DatagramSocket类用于UDP通信,ServerSocket类用于TCP通信的服务器端,Socket类用于TCP通信的服务器和客户端。

5.InetAddress类是用于表示计算机IP地址的一个类

6.最简单的UDP程序:

import java.io.IOException;

import java.net.*;

public class UdpSend {

 

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

       // TODO Auto-generated method stub

       DatagramSocket ds = new DatagramSocket();

       String strInfo = "hello www.xy邢勇.com";

       ds.send(new DatagramPacket(strInfo.getBytes(),strInfo.getBytes().length,InetAddress.getByName("192.168.1.100"),3000));

       ds.close();

    }

}

 

import java.io.IOException;

import java.net.*;

public class UdpRecv {

 

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

       // TODO Auto-generated method stub

       DatagramSocket ds = new DatagramSocket(3000);

       byte[] buf = new byte[1024];

       DatagramPacket dp = new DatagramPacket(buf,1024);

       ds.receive(dp);

       System.out.println(new String(dp.getData(),0,dp.getLength()) +

       "from" + dp.getAddress().getHostAddress() + ":" + dp.getPort());

       ds.close();

    }

}

 

7.用UDP编写网络聊天程序:

       分为三步:

       1.编写图形用户界面

       2.编写网络消息发送功能

       3.编写网络消息接受功能

 

package chat;

 

import java.awt.*;

import java.awt.event.*;

import java.net.*;

 

public class Chat extends Frame {

    List lst = new List(6); // 列表框,最多显示6行,超过后用滚动条

    TextField tfIP = new TextField(15); // ip地址输入文本框,最多显示15个

    TextField tfData = new TextField(20); // 消息输入文本框,最多显示20个

    DatagramSocket ds = null;

 

    public Chat() {

 

       try {

           ds = new DatagramSocket(3000);

       } catch (Exception e) {

           // TODO: handle exception

           e.printStackTrace();

       }

       this.add(lst, "Center");

       Panel p = new Panel();

       this.add(p, "South");

 

       p.setLayout(new BorderLayout());

       p.add(tfIP, "West");

       p.add(tfData, "East");

 

       new Thread(new Runnable() {

           public void run() {

              byte[] buf = new byte[1024];

              DatagramPacket dp = new DatagramPacket(buf, 1024);

              while (true) {

                  try {

                     ds.receive(dp);

                  } catch (Exception e) {

                     if(!ds.isClosed()){

                         e.printStackTrace();

                     }

                  }

                  lst.add(new String(buf, 0, dp.getLength()) + " from "

                         + dp.getAddress().getHostAddress() + ":"

                         + dp.getPort(), 0);

              }

           }

       }).start();

       tfData.addActionListener(new ActionListener() {

           public void actionPerformed(ActionEvent e) {

              byte[] buf;

              buf = tfData.getText().getBytes();

              try {

                  DatagramPacket dp = new DatagramPacket(buf, buf.length,

                         InetAddress.getByName(tfIP.getText()), 3000);

                  ds.send(dp);

              } catch (Exception ep) {

                  // TODO: handle exception

                  ep.printStackTrace();

              }

              tfData.setText("");

           }

       });

 

       addWindowListener(new WindowAdapter() {

           public void windowClosing(WindowEvent e) {

              ds.close();

              dispose();

              System.exit(0);

           }

       });

    }

 

    public static void main(String args[]) {

       System.out.println("Starting Chat..");

       Chat mainFrame = new Chat();

       mainFrame.setSize(300, 400);

       mainFrame.setTitle("Chat");

       mainFrame.setVisible(true);

       mainFrame.setResizable(false);

    }

}

8.TCP客户端程序与TCP服务器端程序的交互过程:

(1)服务器程序创建一个ServerSocket,然后调用accept方法等待客户来连接。

(2)客户端程序创建一个Socket并请求与服务器建立连接。

(3)服务器接受客户的连接请求,并创建一个新的Socket与该客户建立专线连接。

(4)建立了连接的两个Socket在一个单独的线程(由服务器程序创建)上对话。

(5)服务器开始等待新的连接请求,当新的连接请求到达时,重复步骤(2)到(5)的过程。

9.简单的TCP服务器程序:

import java.io.*;

import java.net.*;

 

public class TcpServer {

 

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

       // TODO Auto-generated method stub

       ServerSocket ss = new ServerSocket(8001);

       Socket s =ss.accept();

       InputStream ips = s.getInputStream();

       OutputStream ops = s.getOutputStream();

       ops.write("welcome to www.xy.com".getBytes());

       /*byte[] buf = new byte[1024];

       int len = ips.read(buf); //实际读到的长度

       System.out.println(new String(buf,0,len));*/

       BufferedReader bf = new BufferedReader(new InputStreamReader(ips));

       System.out.println(bf.readLine());

 

       //ips.close();

       bf.close();

       ops.close();

       s.close();

       ss.close();

    }

}

10.完善的TCP服务器程序模型实例:

       服务器程序能够同时与多个客户端会话,客户端每次向服务器发送一行字符文本,服务器就将这行字符文本中的所有字符反向排列后回送给客户端,当客户端想服务器发送的一行字符文本内容为“quit”时,服务器结束与客户端的会话。

TCP服务器程序模型的编写要点:

(1)TCP服务器程序要想能接受多个客户端连接,需要循环调用ServerSocket.accept方法。

(2)服务器程序与每个客户端连接的会话过程不能相互影响,需要再独立的线程中运行。

(3)一个线程服务对象与一个服务器端Socket对象相关联,共同来完成与一个客户端的会话。

import java.net.*;

 

public class ReverseServer {

 

    public static void main(String[] args){

       try {

           // TODO Auto-generated method stub

           ServerSocket ss = new ServerSocket(8001);

           boolean bRunning = true;

           while (bRunning) {

              Socket s = ss.accept();

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

           }

           ss.close();

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

}

 

import java.net.*;

import java.io.*;

 

public class Servicer implements Runnable{

    private Socket s = null;

    public Servicer(Socket s){

       this.s = s;

    }

    public void run(){

       try {

           InputStream ips = s.getInputStream();

           OutputStream ops = s.getOutputStream();

           BufferedReader br = new BufferedReader(

                  new InputStreamReader(ips));

           PrintWriter pw = new PrintWriter(ops,true);

           while(true){

              String strLine = br.readLine();

              if(strLine.equalsIgnoreCase("quit")){

                  break;

              }

              System.out.println(strLine);

              String strEcho = new StringBuffer(strLine).reverse().toString();

              pw.println(strLine + "-->" + strEcho);

           }

           br.close();

           pw.close();

           s.close();

       } catch (IOException e) {

           e.printStackTrace();

       }

    }

}

11.使用netstat命令查看当前正在被使用的TCP端口号。

12.URL(统一资源定位符)的基本组成:协议、主机名、端口号、资源名。

13.URLConnection与HttpURLConnection类编程实例:

       将访问www.google.com站点的HTTP请求消息的Accept-Language头分别设置成日文和中文后,然后打印出www.google.com站点返回的所有响应消息头和网页内容。

import java.net.*;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

import java.io.*;

 

public class GetGoogle {

 

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       try {

           System.out.println("获取日文页面");

           getContentByLanguage("ja");

           System.out.println("\n");

          

           System.out.println("获取中文页面");

           getContentByLanguage("zh-cn");

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

   

    public static void getContentByLanguage(String country)throws Exception{

       URL urlGoogle = new URL("http://www.google.com");

       HttpURLConnection googleConnection = (HttpURLConnection)urlGoogle.openConnection();

       googleConnection.setRequestProperty("Accept-Language",country);

 

      

       Map requests = googleConnection.getRequestProperties();

       Set reqField = requests.keySet();

       Iterator itrReq = reqField.iterator();

       while(itrReq.hasNext()){

           String field = (String) itrReq.next();

           System.out.println(field + ":" +

                  googleConnection.getRequestProperty(field));

       }

 

       Map responses = googleConnection.getHeaderFields();

       Set resFields = responses.keySet();

       Iterator itrRes = resFields.iterator();

       while(itrRes.hasNext()){

           String field = (String) itrRes.next();

           System.out.println(field + ":" +

                  googleConnection.getHeaderField(field));

       }

      

       InputStream is = googleConnection.getInputStream();

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

       String strLine = null;

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

           System.out.println(strLine);

       }

       br.close();

       googleConnection.disconnect();

   

    }

 

}

 

---------------------- android培训、java培训、期待与您交流! ----------------------

 

详细请查看:http://edu.csdn.net/heima