---------------------- android培训、java培训、期待与您交流! ----------------------
?
?
网络编程:
网络通讯要素:
IP地址(InetAddress对象),端口号,传输协议(常用的是TCP、UDP)。
UDP:(聊天、网络视频会议……就是采用UDP,数据不重要只求速度快)
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小在限制在64K内
因是无连接的,所以是不可靠协议
不需要连接,速度快
TCP:
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,效率会稍低
Socket:
它是为网络服务提供的一种机制,
网络的两端都要有Socket
网络通信其实就是Socket间的通信
数据在两个Socket间通过IO传输
UDP:
创建发送UDP的流程:
1、建立UDPSocket服务通过DatagramSocket对象
2、提供数据,并将数据封装到数据包中
(DatagramPacket(byte[]?buf,int?length,InetAddress?address,int?port))
3、通过Socket服务的发送功能,将数据发送出去通过send()方法
4、关闭资源。close()方法
创建接收UDP的流程:
1、定义UDPSocket服务通过DatagramSocket对象
通常会监听一个端口。其实就是给这个接收网络应用程序定义数据标识。
2、定义一个数据包(DatagramPacket(byte[]?buf,int?length))
3、通过socket服务的receive()方法将收到的数据存入已定义好的数据包中
4、通过数据包对象的特有功能,将这些不同的数据取出。打印在控制台上
5、关闭资源
TCP:
TCP传输采用Socket(客户端对象)和ServerSocket(服务端对象)
Socket端:
1、创建客户端的Socket服务,指定目的主机的端口
Socket?socket=new?Socket("172.18.70.136",8888);
2、为了发送数据,应该获取socket流中的输出流
OutputStream?out=socket.getOutputStream();
ServerSocket端:
1、创建服务器端的Socket服务,并监听一个端口。ServerSocket();
2、获取连接过来的客户端对象,通过ServerSocket的accept方法,没有连接就会等,这个方法是阻塞式的。
3、客户端如果发过来数据,服务端要使用对应的客户端对象?,并获取到该客户端对象的读取流来该读取发过来的数据,并打印在控制台。
4、关闭服务端(可选)
?
?
public class TransClient { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket=new Socket("172.18.70.136",10000); //键盘输入数据信息 BufferedReader keyIn= new BufferedReader(new InputStreamReader(System.in)); //发向服务器端的输出流 BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //接收从服务器端过来的输入流 BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())); /** * 这里可以将bufferedReader替换成PrintWriter可以省去了newLine()和flush(); * PrintWriter in=new PrintWriter(new InputStreamWriter(socket.getInputStream())); */ String line=null; while((line=keyIn.readLine())!=null){ if("886".equals(line)){ break; } out.write(line); //不能少了回车和刷新 out.newLine(); out.flush(); String message=in.readLine(); System.out.println("服务器说:"+message); } keyIn.close(); socket.close(); } } public class TransServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket=new ServerSocket(10000); Socket socket=serverSocket.accept(); String ip=socket.getInetAddress().getHostAddress(); System.out.println(ip); //从客户端接收过来的输入流 BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())); //发向客户端的输出流 BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String line=null; while((line=in.readLine())!=null){ out.write(line.toUpperCase()); out.newLine(); out.flush(); //String message=in.readLine(); } socket.close(); serverSocket.close(); } }
?
?
1、因为客户端和服务端都有阻塞式方法,方法没有读到结束标记就一直等
2、因为数据接收到后都在缓冲区,所以要刷新才能真正的写出来,必须flush();
??只要用到缓冲区就要记得刷新。bufferWriter.flush();
?
上传图片例子:
?
public class Client { public static void main(String[] args) throws UnknownHostException, IOException { Socket s=new Socket("172.18.70.136",10003); OutputStream os=s.getOutputStream(); FileInputStream fis=new FileInputStream("20111026214905.png"); int len=0; byte[] data=new byte[1024]; while((len=fis.read(data))!=-1){ os.write(data, 0, len); } s.shutdownOutput(); InputStream is=s.getInputStream(); byte[] num=new byte[1024]; int lens=is.read(num); System.out.println(new String(num,0,lens)); fis.close(); s.close(); } } public class Server { public static void main(String[] args) throws IOException { ServerSocket ss=new ServerSocket(10003); Socket s=ss.accept(); InputStream is=s.getInputStream(); FileOutputStream fos=new FileOutputStream("1.png"); byte[] data=new byte[1024]; int len=0; while((len=is.read(data))!=-1){ fos.write(data, 0, len); } OutputStream os=s.getOutputStream(); os.write("上传成功!".getBytes()); fos.close(); s.close(); ss.close(); } }
?
?
---------------------- android培训、java培训、期待与您交流! ----------------------