java 网络编程基础知识

22人阅读 评论(0) 收藏 举报

TCP/IP协议,,IP地址,4个字节表示;IPV4

127.0.0.1回路IP,不经过网卡的特殊IP地址。

PORT端口号,一个占用两个字节的整数,用于表示数据包该交给哪个网络程序。同样也要指定接受哪个端口号上的数据。

一台计算机上不允许有两个相同端口号得应用程序。

范围在0-65535之间,0-1023之间的端口是用于知名的网络服务和应用。我们编写要用1024以上的··以免冲突。

TCP,,,传输控制协议,面向连接的通信协议。需要建立连接。就像电话

UDP,,,用户数据报协议,是无连接通信协议。不保证数据的可靠传输。

数据帧格式

协议类型--源IP--目标IP--源端口--目标端口--帧序号--帧数据

 

TCP一问一答的方式。。UDP不会等待,直接不停的发送。

 

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

通过一种绑定机制与驱动程序建立关系。告诉对应的IP和PORT  接受方同理;

 

java.net包中

DatagramSocket 类对应udp通信

ServerSocket 类用于TCP通信的服务器端 创建于客户端连接的

Socket 类用于TCP通信的服务器和客户端  这里的服务器是用于向客户端传输数据的

如果没有创建端口号,会自动选择一个没有被使用的。

如果没有指定IP地址,驱动会随机指定计算机上的一个IP;

对于只有一个IP地址的计算机,一般不用指定IP地址

 

udp网络程序

DatagramSocket类    发送数据时最好用无参构造,如果有可能接受数据选择带端口号参数的构造函数,如果有多个IP地址选择带端口号和IP的构造函数,,,close方法调用后,此端口号就可以被驱动分配给别的应用程序。

send(DatagramPacket p )发送数据报方法     receive(DatagramPacket p)接受数据报方法

DatagramPacket数据容器   接受数据时的构造函数,  发送数据时的构造函数

getInetAddress()和getPort()接受数据可以获取发送方IP和PORT,,,getData和getLength方法获取实际接受数据和数据长度。

 

 

InetAddress 用于表示IP地址的类   getByName放回此类得示例。getHostAddress放回此对象当中用点分割的地址

 

 

  1. //发送方   
  2. public class UdpSend{  
  3.            public static void main(String[] args){  
  4.                 DatagramSocket ds = new DatagramSocket();  
  5.                 String strInfo = "hello ww.it315.org";  
  6.                 ds.send(new DatagramPacket(strInfo.getBytes()),strInfo.getBytes().length,InetAddress.getByName("192.168.1.100"),3000));  
  7.                 ds.close();  
  8.            }  
  9. }  
  10. //接受数据方   
  11. public class UdpRecv{  
  12.             public static void main(String[] args){  
  13.                 DatagramSocket ds = new DatagramSocket(3000);  
  14.                 byte[] buf = new byte[1024];  
  15.                 DatagramPacket dp = new DatagramPacket(buf,1024);  
  16.                 //启动接受数据方,如果没有数据可接受,当前线程将被阻塞   
  17.                 ds.receive(dp);  
  18.                 String str = new String(buf,0,dp.getLength());  
  19.                 System.out.println(dp.getAddress().getHostAddress()+":"+dp.getPort()+str);  
  20.                 ds.close();  
  21.            }  
  22. }  

 

 

 

只有UDP才能发送和接受广播地址数据,,广播地址需要根据子网掩码来计算。。如果是255.255.254.0,那么广播地址就是192.168.1.255。。。 

私有IP通过网关代理上网的计算机不能与具有合法internetIP地址的计算机进行对话。

网关中有一张转发映射表,发送和接受数据,都会根据映射表来中转。转发映射表有失效性。一段时间内没有数据来往,网关就会清楚掉转发映射表中的记录,那么外部计算机就不能访问到网关内部的计算机了。

 网关上也可以配置静态的转发映射记录。实现网关内计算机与inter网上计算机进行数据交换····

 

 

TCP网络:

 

TCP程序有主从之分,分为客户端机和服务器端机。。

 客户端机对应socket类,服务器对应serverSocket类

 

服务器端首先创建ServerSocket类,调用accept方法等待客户端的连接。客户端程序创建一个socket并请求与服务器建立连接,

接着服务器接受客户端连接并创建一个新的socket于客户机建立专线连接!

建立了连接的两个socket在服务器端创建的一个新的线程上进行对话。接着ServerSocket又开始等待客户端机请求连接,

并重复执行这些步骤。

 

 

ServerSocket(int port 端口号(如果写入0,计算机将会自动给服务器程序分配端口号),,,int backlog  默认为50,指定服务器建立于客户端机请求连接的最大等待连接数。。InetAddress 绑定到的本地 IP 地址创建服务器),一般只用指定端口号    同样拥有close方法

accept,等待客户端连接请求,一旦接受后方法返回一个与客户端专线连接的socket对象。如果没有客户端请求连接,将使线程处于阻塞状态。

 

Socket(绑定服务器IP(接受字符串类型和InetAddress类型),绑定服务器端口号)也可以指定本机IP和端口,,一般不指定。

不用将socket构造函数用于服务器端创建socket对象。

 

连接后他们以网络字节流的方式进行数据交换,,,getInputStream方法,以及getOutputStream方法,用于返回socket的输入输出流对象。

  1. package socketTest;  
  2.   
  3. import java.io.InputStream;  
  4. import java.io.OutputStream;  
  5. import java.net.Socket;  
  6. /** 
  7. *  socket客户端机 
  8. */  
  9. public class TcpClient {  
  10.     public static void main(String[] args) {  
  11.           
  12.         try {  
  13.             Socket s= new Socket("192.168.1.101",8001);  
  14.             InputStream ips = s.getInputStream();  
  15.             OutputStream ops = s.getOutputStream();  
  16.             byte[] bur = new byte[1024];  
  17.             int len = ips.read(bur);  
  18.             System.out.println(new String(bur,0,len));  
  19.             ops.write("建立连接成功啦!!".getBytes());  
  20.             ops.close();  
  21.             ips.close();  
  22.             s.close();  
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.           
  27.     }  
  28. }  
  29. package socketTest;  
  30.   
  31. import java.io.*;  
  32. import java.net.*;  
  33. /** 
  34. *  socket服务器端 
  35. */  
  36. public class TcpTest {  
  37.     public static void main(String[] args) {  
  38.         try {  
  39.             ServerSocket ss = new ServerSocket(8001);  
  40.             Socket s = ss.accept();  
  41.             InputStream ips = s.getInputStream();  
  42.             OutputStream ops = s.getOutputStream();  
  43.             ops.write("welcome to My House!!陈亮宇".getBytes());  
  44.             byte[] bur = new byte[1024];  
  45.             int len = ips.read(bur);  
  46.             System.out.println(new String(bur,0,len));  
  47.             ops.close();  
  48.             ips.close();  
  49.             s.close();  
  50.             ss.close();  
  51.         } catch (IOException e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.           
  55.     }  
  56. }  
  57. /** 
  58. *一台服务器,多台客户端机进行对话! 
  59. */  
  60.   
  61.   
  62. import java.io.BufferedReader;  
  63. import java.io.InputStreamReader;  
  64. import java.io.OutputStreamWriter;  
  65. import java.io.PrintWriter;  
  66. import java.net.Socket;  
  67.   
  68. public class Servicer implements Runnable {  
  69.     private Socket s ;  
  70.     public Servicer(Socket s){  
  71.         this.s = s;  
  72.     }  
  73.     @Override  
  74.     public void run() {  
  75.         try{  
  76.               
  77.             BufferedReader bf = new BufferedReader(  
  78.                     new InputStreamReader(  
  79.                             s.getInputStream()));  
  80.             PrintWriter pw = new PrintWriter(  
  81.                     new OutputStreamWriter(  
  82.                             s.getOutputStream()),true);  
  83.             while(true)  
  84.             {  
  85.                 String msg = bf.readLine();  
  86. System.out.println(msg);  
  87.                 if(msg.equalsIgnoreCase("exit"))  
  88.                     break;  
  89.                 StringBuffer sb = new StringBuffer(msg).reverse();  
  90.                 pw.println(msg+"-------->"+sb.toString());  
  91.             }  
  92.             pw.close();  
  93.             bf.close();  
  94.             s.close();  
  95.         }catch(Exception ex){  
  96.             ex.printStackTrace();  
  97.         }  
  98.     }  
  99.       
  100. }  
  101.   
  102. import java.io.*;  
  103. import java.net.*;  
  104.   
  105. public class TcpTest {  
  106.     public static void main(String[] args) {  
  107.         try {  
  108.             ServerSocket ss = new ServerSocket(8001);  
  109.             boolean isRunning = true;  
  110.             while(isRunning){  
  111.                 Socket s = ss.accept();  
  112.                 Servicer svr = new Servicer(s);  
  113.                 new Thread(svr).start();  
  114.             }  
  115.               
  116.         } catch (IOException e) {  
  117.             e.printStackTrace();  
  118.         }  
  119.           
  120.     }  
  121. }  
  122.   
  123.   
  124.   
  125.   
  126. import java.io.BufferedReader;  
  127. import java.io.InputStreamReader;  
  128. import java.io.OutputStreamWriter;  
  129. import java.io.PrintWriter;  
  130. import java.net.Socket;  
  131. import java.util.Scanner;  
  132.   
  133. public class TcpClient {  
  134.     public static void main(String[] args) {  
  135.         Socket s = null;  
  136.         BufferedReader br =null;  
  137.         PrintWriter pw =null;  
  138.         try {  
  139.             s= new Socket("192.168.1.101",8001);  
  140.             br = new BufferedReader(  
  141.                     new InputStreamReader(s.getInputStream()));  
  142.             pw = new PrintWriter(new OutputStreamWriter(  
  143.                     s.getOutputStream()),true);  
  144.             while(true){  
  145.                 Scanner input = new Scanner(System.in);  
  146.                 pw.println(input.nextLine());  
  147.                 System.out.println(br.readLine());  
  148.             }  
  149.         } catch (Exception e) {  
  150.             e.printStackTrace();  
  151.         }finally{  
  152.             try{  
  153.             pw.close();  
  154.             br.close();  
  155.             s.close();  
  156.             }catch(Exception e)  
  157.             {  
  158.                 e.printStackTrace();  
  159.             }  
  160.         }  
  161.           
  162.     }  
  163. }  

 

 

TCP服务器端要想于多个客户端程序进行连接就要循环调用serversocket的accept方法。。。

每一个服务器创建的与某个客户端之间的连接之间不能互相干扰,应该放在单独的线程当中运行。

一个服务器端对象于一个单独的线程相关联,来独立完成于客户端的会话过程。

 

解决TCP服务器程序端口号冲突问题:  使用netstat -n 查询正在使用中的端口号。

通过配置信息来指定程序端口号。用户可以通过修改配置文件来指定程序指定的端口

 

通过指定参数编写客户端机代码,将服务器IP和端口号作为参数。可以使程序更加灵活。。

 

ASP和JSP是用于编写网站内容的,并不是网络编程!!!!

 

 

访问网络资源:

URL统一资源定位符   URL编码规则空格将转换为+号,,普通数字和字母正常显示,特殊符号将用%打头加上它的十六进制表现形式。

java中提供了URLEncoder类和URLDecoder类来实现URL的编码和解码。。。

 

HTTP请求消息,,请求行,,消息头,,空格,,(实体)一般是表单提交的值

HTTP响应消息,,状态行,,消息头,,空格,,实体,网页内容。

 

HTTP消息头字段,

Connection,,,,默认为Keep-Alive,返回消息保持连接,,,close返回消息关闭连接。

Accept-Lanuage,,,,指定客户端所期望返回消息的国家语言,可以指定多个,以逗号分隔

Range :bytes = 100-588      显示指定位置内容,单位为字节100>= <=588

              bytes = 100-            100后所有

              bytes = -100             最后100

Content-Range : bytes 1234-5678/10000

 

 

出自:http://blog.csdn.net/a15874647/article/details/6381560

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章