一、网络层次模型
OSI模型 TCP/IP模型
应用层:应用程序
表示层:数据处理,编解码,解压缩,格式转换
会话层:进程通信和,数据同步 应用层:
传输层:传递数据segment和datagram 传输层:
网络层:路由及包packet 网络互联层:
数据链路层:帧传输frame 网络接口层:
物理层:物理连接,bit
二、TCP/IP协议套接字
服务器端ServerSocket和客户端Socket
需要目标IP地址和端口号,协议为TCP协议。
服务器端采用accept方法返回一个套接字,该端口不再是服务器侦听端口。
还可以设置超时时间,其他端口,地址什么的,可以获得输入输出流。传递数据
三、UDP套接字
DatagramSocket,可以用来发送和接收用户报文。
数据包DatagramPacket(数据字节数组,长度,目标IP,目标端口)用来发送的包
数据包DatagramPacket(数据字节数组,长度)用来接收的包
send(packet),和receive(packet)方法来接收发送数据包。
四、URL使用
URL的组成:
协议://主机名:端口/路径?查询字符串#描点引用
new URL(协议,主机IP,端口,文件)
方法有很多:
openConnection()打开连接,可以与URL进行通信
setDoInput(true),设置可以进行输入,一般默认true。
setDoOutput(true),设置可以进行输出,一般默认false。
还有其他的到路径,文件;主机名,授权;端口号,默认端口号;协议;查询;描点;输入流;输出流
列子:
import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ConnectException; import java.net.Socket; import java.net.UnknownHostException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import javax.swing.JOptionPane; public class Client implements ActionListener{ private static String name ;//服务器名字,就是本机名字 private MyFrame father; private int buffSize; public Client(){ } public Client(int buffSize,MyFrame father){ this.buffSize = buffSize; this.father = father; System.out.println("客户端:"+this.name+" 启动"); } @Override public void actionPerformed(ActionEvent ex) { // TODO Auto-generated method stub Socket socket = null; String ip = father.getIpTxt().getText(); BufferedInputStream bis = null; BufferedOutputStream bos = null; byte[] b = new byte[this.buffSize]; int length = 0; try{ socket = new Socket(ip,9527); //发送文件,并且不是键盘输入enter if(ex != null && ex.getActionCommand().equals("发文件")){ String inputFilePath = father.getFilePathTxt().getText(); if(!"filepath\file".equals(inputFilePath) || "".equals(inputFilePath)){ File file = new File(inputFilePath); if(file.isFile()){ FileInputStream fis = new FileInputStream(file); bis =new BufferedInputStream(fis); bos = new BufferedOutputStream(socket.getOutputStream()); this.father.getMessageArea().append("开始传送文件:"+file.getName()+"\n"); //写入传送文件标志位0 bos.write(0); //写入文件名 bos.write(file.getName().getBytes("utf-8")); //写入文件名结束标志位0 bos.write(0); //正式传送文件内容 while((length = bis.read(b)) != -1 ){ bos.write(b,0,length); bos.flush(); // System.out.println("传送的数据:"+new String(b,0,length)); } //文件发送完成 this.father.getMessageArea().append("传送完成:"+file.getName()+"\n"); father.getFilePathTxt().setText("filepath\\file"); } else{ //文件路径错误 this.father.getMessageArea().append("文件路径错误,找不到文件"+"\n"); } } }else{ //本次操作是发送消息 try { String message = this.father.getMessageTxt().getText(); bos = new BufferedOutputStream(socket.getOutputStream()); if(!"".equals(message)){ //发消息,首先写标志位为1 bos.write(1); Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); this.father.getMessageArea().append("我自己: "+sdf.format(now).substring(10)+"\n"+message+"\n"); this.father.getIpTxt().setText("192.168.1.126"); this.father.getMessageTxt().setText(""); //用utf-8来编码信息 byte[] by = (this.name+"&"+sdf.format(now)+"&"+message).getBytes("utf-8"); //将信息写入到socket bos.write(by); bos.flush(); }else{ JOptionPane.showMessageDialog(null, "不能发送空信息!"); } father.getMessageArea().setCaretPosition(father.getMessageArea().getText().length()); } catch (UnknownHostException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }catch(UnknownHostException ukh){ System.out.println(father.getIpTxt().getText()+"--是无效IP"); father.getMessageArea().append(father.getIpTxt().getText()+"--是无效IP\n"); } catch(ConnectException et){ System.out.println("无法连接目标IP"); father.getMessageArea().append("无法连接目标IP\n"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(socket != null){ try { socket.close(); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } if(bos != null){ try { bos.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } if(bis != null){ try { bis.close(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } } public int getBuffSize() { return buffSize; } public void setBuffSize(int buffSize) { this.buffSize = buffSize; } public static String getName() { return name; } public static void setName(String name) { Client.name = name; } }