您的位置:首页 > 理论基础 > 计算机网络

黑马程序员——网络编程之TCP传输

2014-11-05 11:11 441 查看
TCP协议是网络传输中的又一个重要规则,它需要先建立连接,形成传输数据的通道,在连接中进行大数据量的传输,通过三次握手完成连接,是可靠的协议,但它的传输速度慢。两个端点通过TCP建立连接后的数据传输通道称为Socket流,两个端点(客户端、服务端)对应的对象分别是Socket、ServerSocket。

TCP客户端:

(1)建立tcp的Socket服务,最好明确具体的地址和端口。

(2)如果连接成功,就意味着通道建立了,socket流就已经产生了。

(3)获取socket流中的读取流或输入流,通过getInputStream或getOutputStream,进行数据操作。

(4)关闭资源。

import java.io.*;
import java.net.*;

public class tcpClient {
public static void main(String[] args) throws Exception{
//建立客户端的socket服务,指定地址和端口。这里先不去处理异常。
Socket s=new Socket("127.0.0.1",10004);
//获得输出流,写出数据。
OutputStream out=s.getOutputStream();
out.write("服务端,我是客户端".getBytes());
byte[] buf=new byte[1024];
//获得输入流,读取数据。
InputStream in=s.getInputStream();
int len=in.read(buf);
System.out.println(new String(buf,0,len));
//关闭资源
s.close();
}
}


TCP服务端:

(1)创建服务端Socket服务,并监听一个端口。

(2)服务端为了给客户端提供服务,获取客户端的内容,可以通过accept方法获取连接过来的客户端对象。

(3)通过Socket流与客户端进行具体的通讯。

(4)通讯结束,关闭资源。注意:要先关客户端,再关服务端。

public class tcpServer {
public static void main(String[] args) throws Exception {
//建立服务端的socket服务。
ServerSocket ss=new ServerSocket(10005);
//获取客户端对象。
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+".......connected");
//读取客户端的数据。
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
//向客户端发送数据。
OutputStream out=s.getOutputStream();
out.write("我是服务端,我已经收到了".getBytes());
//通讯结束,关闭资源。
s.close();
}
}


输出结果:

服务端收到的数据:127.0.0.1.......connected

服务端,我是客户端

客户端收到的数据:我是服务端,我已经收到了

利用TCP协议来写一个简单的文件上传程序,客户端从自己硬盘上上传一张图片,服务端把这张图片保存在自己的硬盘下。

客户端:

import java.io.*;
import java.net.*;

public class tcpUpdataClient {
public static void main(String[] args) throws Exception{
//客户端建立socket服务。
Socket s=new Socket("127.0.0.1",10011);
//读取硬盘中的图片
FileInputStream fis=new FileInputStream("c:\\丽江.jpg");
//获取socket流中的输出流
OutputStream os=s.getOutputStream();
byte[] buf=new byte[1024];
int len=0;
while((len=fis.read(buf))!=-1){
os.write(buf);
}
//完成传输,主动端口输出流。应对阻塞时方法。
s.shutdownOutput();
//获取socket流中的读取流,来接收服务端发来的消息。
InputStream is=s.getInputStream();
byte[] b=new byte[1024];
int l=is.read(b);
System.out.println(new String(b,0,l));
//关闭资源
fis.close();
s.close();
}
}


服务端:

import java.net.*;
import java.io.*;

public class tcpUpdataServer {
public static void main(String[] args) throws Exception {
//建立服务端 的socket服务
ServerSocket ss=new ServerSocket(10011);
//获取客户端的socket对象
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"............is Connected!");
//socket流的读取流,
InputStream is=s.getInputStream();
//就流里的数据写到硬盘中。
FileOutputStream fos=new FileOutputStream("d:\\副本.jpg");
byte[] buf=new byte[1024];
int len=0;
while((len=is.read(buf))!=-1){
fos.write(buf);
}
//socket流的输出流,在上传成功后给客户端返回消息。
OutputStream os=s.getOutputStream();
os.write("上传成功!".getBytes());
//关闭资源
s.close();
ss.close();
}
}


值得注意的是,对于阻塞式方法,要提供停止标签!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: