《java之旅(三十三)》由会员分享,可在线阅读,更多相关《java之旅(三十三)(12页珍藏版)》请在金锄头文库上搜索。
1、JAVA 之旅(三十三)一.TCP说完 UDP,我们就来说下我们应该重点掌握的 TCP 了TCP 传输 Socket 和 ServiceSocket建立客户端和服务端建立连接后,通过 Socket 中的 IO 流进行数据的传输关闭 Socket同样的,我们的客户端和服务端都是两个独立的应用我们通过查阅 API 文档发现,该对象在建立的时候,就可以去连接指定主机,因为 tcp 是面向连接的,所以在建立 socket 服务时,就要有服务存在,并成功连接,形成通路后,在该通道进行数据传输所以我们用代码来看下他的步骤客户端package com.lgl.hellojava;import java.io
2、.IOException;import java.io.InputStream;import java.io.OutputStream;import .ServerSocket;import .Socket;import .UnknownHostException;public class TcpClient public static void main(String args) try /1.创建客户端的服务,传地址和端口Socket s = new Socket(192.168.1.102,10000);/2.为了发送数据,应该获得 socket 流中的输出流OutputStream o
3、ut = s.getOutputStream();out.write(你好.getBytes();s.close(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); 服务端package com.lgl.hellojava;import java.io.IOException;import java.io.InputStr
4、eam;import .ServerSocket;import .Socket;/* 定义端点接收数据打印出来* 服务端:* 1.建立服务端的 socket 服务,servicesocket,并监听一个端口* 2.获取连接过来的客户端对象,通过 accept 方法,这个方法是阻塞的,没有连接就会等* 3.客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该对象的读取流* 4.关闭服务端(可选操作)* author LGL*/public class TcpService public static void main(String args) try /1.建立连接,监听端口Se
5、rverSocket ss = new ServerSocket(10000);/2.连接客户端对象Socket accept = ss.accept();/获取 ipString ip = accept.getInetAddress().getHostAddress();/3.获取客户端发送过来的数据InputStream in = accept.getInputStream();/4.开始读取byte buf = new byte1024;int len = in.read(buf);System.out.println(new String(buf,0,len);/5.关闭ss.clos
6、e(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace(); 二.TCP 互相传输我们在来写一个实例去说明,他们的互访动作,这里为了写起来方便,就写在一个类中了package com.lgl.hellojava;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import .ServerSocket;import .Socket;import .UnknownHostExcepti
7、on;/* 客户端发送信息,服务端收到,反馈信息* * author LGL*/public class Tcp public static void main(String args) try Socket s = new Socket(192.168.1.102, 10005);OutputStream out = s.getOutputStream();out.write(我是客户端.getBytes();InputStream in = s.getInputStream();byte buf = new byte1024;int len = in.read(buf);System.ou
8、t.println(new String(buf, 0, len);s.close(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();/* * 服务端* author LGL*/class Server public static void main(String args) try ServerSocket ss = n
9、ew ServerSocket(10005);Socket s = ss.accept();InputStream in = s.getInputStream();byte buf = new byte1024;int len = in.read(buf);System.out.println(new String(buf, 0, len);OutputStream out = s.getOutputStream();out.write(收到后反馈.getBytes();s.close();ss.close(); catch (IOException e) / TODO Auto-genera
10、ted catch blocke.printStackTrace();三.复制文件同样的这里也是使用的流,我们具体来看下怎么去操作,我们同样的,写在一个类中package com.lgl.socket;import java.io.BufferedReader;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .S
11、ocket;import .UnknownHostException;public class FileClient public static void main(String args) try Socket s = new Socket(192.168.1.102, 10006);BufferedReader bufr = new BufferedReader(new FileReader(test.txt);PrintWriter pw = new PrintWriter(s.getOutputStream(), true);String line = null;while (line
12、 = bufr.readLine() != null) pw.println(line);pw.print(over);BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream();String str = bufIn.readLine();System.out.println(str);bufr.close();s.close(); catch (UnknownHostException e) / TODO Auto-generated catch blocke.printStackTra
13、ce(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();class FileServer public static void main(String args) try ServerSocket ss = new ServerSocket(10006);Socket s = ss.accept();BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream();PrintWriter o
14、ut = new PrintWriter(new FileWriter(test1.txt), true);String line = null;while (line = bufIn.readLine() != null) if (over.equals(line)break;out.println(line);PrintWriter pw = new PrintWriter(s.getOutputStream(), true);pw.println(上传成功);out.close(); s.close();ss.close(); catch (IOException e) / TODO A
15、uto-generated catch blocke.printStackTrace();四.上传图片我们再来看下图片是怎么上传的,我们先来分析下步骤客户端1.服务端点2.读取客户端已有的图片数据3.通过 socket,发送给服务端4.读取服务端反馈的信息5.关闭资源* 客户端* * author LGL*/public class PicClient public static void main(String args) try Socket s = new Socket(192.168.1.102, 10009);FileInputStream fis = new FileInputStream(1.png);OutputStream out = s.getOutputStream();byte buf = new byte1024;int len = 0;while (len = fis.read(buf) != -1) out.write(buf, 0, len);/告訴服务端数据写完s.shutdownInput();InputSt