赞
踩
网络编程三大要素
IP地址
网络中设备的标识
不易记,可用主机名
本地环回地址127.0.0.1 主机号 localhost
分类
A类地址
范围0--127,o 是保留地址 子网掩码225.0.0.0
B类地址
128--191 子网掩码225,225.0.0
C类地址
192--223 子网掩码225,225.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地址处理
Java对IP地址的处理类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();
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。