Java-网络编程

来源:互联网 发布:刘亦菲票房毒药知乎 编辑:程序博客网 时间:2024/05/17 02:47

1.本地回路的IP地址:127.0.0.1 测试本机网络程序
port 端口号,范围0~65535

 

2.UDP与TCP
TCP:传输控制协议,面向连接的通信协议
UDP:用户报协议,是无连接的通信协议

 

3.Scoket
网络驱动层提供给应用程序编程的接口和一种机制
Socket在应用程序中创建,通过一种绑定机制与驱动程序建立关系,告诉自己所对应的IP和Port

 

4.Socket数据发送过程

 

5.Java中的网络编程
位于java.net包中
DatagramSocket类用于UDP通信
ServerSocket类用于TCP通信的服务器端
Socket类用于TCP通信的服务器和客户端

UDP网络程序
①DatagramSocket类(创建发送的港口)
构造函数
publicDatagramSocket()//没有指定端口号
publicDatagramSocket(int port)
publicDatagramSocket(int port,InetAddress laddr)
close()方法
send(DatagramPacket P)方法
receive(DatagramPacket P)方法
②DatagramPacket类(待发送的集装箱)
public DatagramPacket(byte[]buf,int length)
public DatagramPacket(byte[]buf,int length,LnetAddresss address,int port)
getlnetAddress和getPort方法
getData和getLength方法
③LnetAddress类用于表示计算机IP地址的一个类
getName方法
getHostAddress方法

 

 

字符串与字节数组之间的双向转换
(start命令打开新命令窗口好处,完全继承原窗口环境;
解决中文字符显示:中文字符转换成字节会占用2个字节)
编程实例:
发送程序:UdpSend.java
import java.net.*;
public class UdpSend
{
 public static void main(String [] args) throws Exception
 {
  DatagramSocket ds=new DatagramSocket();
  String str="hello world";
  DatagramPacket dp=new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.3"),3000);//public DatagramPacket(byte[]buf,int length,LnetAddresss address,int port);str.length中加getBytes,成str.getBytes.length()解决中文字符不显示问题
  ds.send(dp);
  ds.close();
 }
}

接收程序:UdpRecv.java//先启动接收者,在启动发送者
import java.net.*;
public class UdpRecv
{
 public static void main(String [] args) throws Exception
 {
  DatagramSocket ds=new DatagramSocket(3000);//接受程序,端口号事先设定,DatagramSocket会发生异常
  byte [] buf=new byte[1024];//
  DatagramPacket dp=new DatagramPacket(buf,1024);//接收数据
  ds.receive(dp);//接受数据到DatagramPacket中
  String strRecv=new String(dp.getData(),0,dp.getLength()) +
  " from " + dp.getAddress().getHostAddress()+":"+dp.getPort();//第0个字节开始,一直取到getLength()个长度; getAddress()获得IP地址信息;getHostAddress方法转换IP为192.168格式
  System.out.println(strRecv);
  ds.close();
 }
}

 

 

TCP网络程序
1.工作原理
TCP客户端程序与TCP服务端程序的交互过程:
①服务器程序创建
2.ServerSocket类
构造函数:
public ServerSocket(int port,int backlog,lnetAddress bindAddr)
close方法
accept方法
3.Socket
构造函数:public Socket(lnetAddress address,int port,lnetAddress localAddress,int localPort)
getInputStream和getOutStream方法
编程实例:简单的TCP程序:
import java.net.*;
import java.io.*;
public class TcpServer
{
 public static void main(String [] args)
 {
  try
  {
  ServerSocket ss=new ServerSocket(8001);//监听
  Socket s=ss.accept();//没有客户端连接一直阻塞
  InputStream ips=s.getInputStream();
  OutputStream ops=s.getOutputStream();//getOutputStream返回输出流对象
  ops.write("welcome to ());

  /*byte [] buf = new byte[1024];
  int len = ips.read(buf);
  System.out.println(new String(buf,0,len));将字节数组buf转换成字符串*/
                /*以上代码,只能读一个字符*/
  BufferredReader br = BufferredReader(new InputStreamReader(ips));
  System.out.println(br.readLine());
  br.close()  
  ips.close();
  ops.close();
  s.close();
  ss.close();
  }catch(Exception e){e.printStackTrace();}
 }
}

 

完善的TCP服务器程序模型
TCP服务器程序模型的编程要点:
- TCP服务器程序要想能接收多个客户端连接,需要循环调用ServerSockert.accept
- 服务器程序与每个客户端连接的会话程序不能互相影响,需要在独立的线程中运行
- 一个线程服务对象与一个服务器端Socket对象相关联,共同来完成与一个客户端的会话


如何检测和解决端口冲突
端口被占用,检测端口方法:netstat查看正在使用的TCP端口。
通过一个配置参数来指定TCP服务程序所使用的端口号。
import java.net.*;
import java.io.*;
public class TcpClient
{
 public static void main(String [] args)
 {ServerSocket ss=null;
/*if(args.length <1)
ss = new ServerSocket(8001);
else
ss= new ServerSocket(Interger.parse(args[0]));*/插入代码


在TCP网络连接上传递对象:

学生类:
import java.io.serializable

public class Student implements Serializable{
int id;
String name;
int age;
string department;
public student(int id,String name,int age)
{
this.id = id;
this.name =name;
this.age = age;
this.department = department;
}
}
服务器端:
import java.io.*

public class ObjectServer{
 public static void mian()throws EXception
 { 
  ServerSocket ss = new ServerSocket(8001);
  Socket s = ss.accept();
  OutputStream oos = new ObjectOutputStream(ops);
  student stu = new Student(19,"wangwu",22,"huaxue")
  oos.writeObject(stu);

  oos.close();
  s.close();
  ss.close();
 }
}
客户端
import java.net.*;
import java.io.*;

public class ObjectClient{
public static void mian(){
Socket s = new Socket("127.0.0.1",8001);
InputStream ips = s.getInputStream(ips);
ObjectInputStream ois = new ObjectInputStream(ips);

student stu = (student)ois.readObject();
System.out.println("id is"+stu.id);
System.out.println("name is"+stu.name)
System.out.println("age is"+stu.age);
System.out.println("department is"+stu.department);
}
}

 

访问Internet网络资源:
URL(uniform Resource Locator)
URL的基本组成:协议、主机名、端口号、资源名

URL编码规则:
将空格转换成加号(+),也可直接使用其十六进制表示,前加%,即%2B;其它字符都可用十六进制表示,每字节前加%。

HTTP协议的会话过程
了解几个HTTP消息头
Connection用于指定处理完
Accpt-Languag
Conect-Length
Range用于指定服务器只需返回文档中的部分内容及内容范围,格式:
Range:byte100-599返回100-599个字节内容、/-100最后100个
Content-Range用于指定服务器返回的部分实体内容的位置信息

URL类
构造方法(可能引发MslformedURLException异常)
public URL(String spec)
public URL(String protocol)
public URL(目录资源,)
指向网络资源的getPortotcol、getHost、getPort、getFile等方法
openConnection方法返回URLConnection对象

 

 

工厂设计模式
URL类的setURLStreamHandlerFactory(URLStreamhandlerFactory fac)静态方法
StreamHandler类的createURLStreamHandler(String portocol//ftp、http...)方法
不希望将如何创建出xy则可用工厂模式

 

 

URLConnection与Http
URLconnection类
URLConnection与HttpURLConnect,编程实例:

import java.net.*;
import java.io.*;
imprt java.util.*;
public class getgoogle{
public static void mian(String args[]){

}
public static void getContentBylanguage(String conntry)

URL urlgoogle = new URL("www.google,com";)
HttpURLConnection googleConnection = (HttpURLConnection)urlGoogle.openConnection
}                        
                                                                                                                                          

原创粉丝点击