---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
一、TCP传输协议
TCP特点:
面向连接的、通信是安全可靠的、速度慢、可以用于大数据传输、通过3次握手建立连接
可以用于下载数据。
要用到net包和io包;
发送端:数据无需封包操作,直接通过socket类中的输出流和输入流,将数据输入或者输出到socket流中
需要定义结束标记
结束端:通过serverSocket类中,accept()进行连接发送端
用的缓冲区,需要用到io包
练习代码:
/* Tcp传输
注意:一定一定要,使用了缓冲区技术,要换行newLine(),要刷新fulsh();
还有定义结束标记
*/
import java.net.*;
import java.io.*;
class Socket1
{
public static void main(String[] args)throws Exception
{
//创建socket流对象
Socket s=new Socket("125.126.146.21",10004);
//获取键盘录入
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//获取socket输出流
BufferedWriter bufwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//获取socket输入流
BufferedReader bufrin=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null)
{
bufwout.write(line);
if("over".equals(line))
break;
bufwout.newLine();//换行
bufwout.flush();//刷新
String str=bufrin.readLine();
System.out.println("ServerSocket::"+str);
}
bufrin.close();
s.close();
}
}
//服务端
class TcpServer1
{
public static void main(String[] args)throws Exception
{
//创建服务端socket流对象
ServerSocket ss=new ServerSocket(10004);
//与客户端进行连接
Socket s=ss.accept();
//获取输入流
BufferedReader bufrin=new BufferedReader(new InputStreamReader(s.getInputStream()));
//获取输出流
BufferedWriter bufwout=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//获取客户端ip地址
String ip=s.getInetAddress().getHostAddress();
System.out.println("\\"+ip+"::::::::::::");
String line=null;
while((line=bufrin.readLine())!=null)
{
bufwout.write(line);
//bufwout.write(line.toUpperCase());
bufwout.newLine();//换行
bufwout.flush();//刷新
System.out.println("socket="+line);
}
bufwout.close();
}
}
代码练习二:
/* Tcp传输 Tcp传输,面向连接的,安全的传输协议
分为两部分:
客户端:socket类--->类中有getOutputStream()方法获取输出流
在流中写入数据write()方法,并转换成字节流
进行发送数据。指定一个ip
*/
import java.net.*;
import java.io.*;
class Socket
{
public static void main(String[] args)
{
Sockt s=new Socket("125.126.146.21",100002);
OutputStream out=s.getOutptuStream();
out.write("我是客户端".getBytes());
s.close();
}
}
/*
服务端接收数据,并打印在控制台
1,服务端:ServerSocket类,建立对象是并监听一个端口
2 ,获取连接过来的客户端对象
通过ServerSocket对象的accept()方法。没有连接就会等,阻塞式方法
3,客户端如果发来数据,那么服务端要使用客户端对象
并用客户端的读取流来读取客户端发来的数据
并打印
4,关闭资源(可选项)
*/
class TcpServer
{
public static void main(String[] args)
{
ServerSocket ss=new ServerSocket(10002);
Socket s=ss.accept();
InputStream in=s.getInputStream();
String ip=s.getInetAddress.getHostAddress();
System.out.println(ip);
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,buf.length()));
}
}
代码练习3: 上传图片到服务端
/*
上传图片上传图片 上传图片
*/
import java.io.*;
import java.net.*;
class Pic{
public static void main(String[] args)throws Exception
{
Socket s=new Socket("125.126.150.32",10003);
FileInputStream fi=new FileInputStream("1psu.jpg");
OutputStream out=s.getOutputStream();
byte[] b=new byte[1024];
int len=0;
while((len=fi.read(b))!=-1){
out.write(b,0,len);
}
//结束标记
s.shutdownOutput();
InputStream in=s.getInputStream();
byte[] by=new byte[1024];
int line=in.read(by);
System.out.println(new String(by,0,line));
fi.close();
s.close();
}
}
class PicServer{
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(10003);
Socket s=ss.accept();
InputStream in=s.getInputStream();
FileOutputStream fos=new FileOutputStream("复制_秀云.jpg");
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip);
byte[] b=new byte[1024];
int len=0;
while((len=in.read(b))!=-1){
fos.write(b,0,len);
}
OutputStream out=s.getOutputStream();
out.write("pic图片上传成功!!!!!!!!!!!".getBytes());
fos.close();
s.close();
}
}
代码练习4;上传文本文件到服务端
/* 上传文本文件:云.txt
用于客户端的输出流:
void shutdownOutput()
禁用此套接字的输出流。
*/
import java.io.*;
import java.net.*;
//自定义客户端
class SocketTxt{
public static void main(String[] args)throws Exception
{
Socket s=new Socket("125.126.150.32",10002);
//创建带缓冲区的读取流对象
BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream("云.txt")));
//创建socket输出流
PrintWriter pwOut=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=br.readLine())!=null){
pwOut.write(line);
}
//输出流结束标记
s.shutdownOutput();
//获取socket读取流
BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
String len=brIn.readLine();
System.out.println(len);
br.close();
s.close();
}
}
//自定义服务端
class ServerSocketTxt{
public static void main(String[] args)throws Exception
{
ServerSocket ss=new ServerSocket(10002);
Socket s=ss.accept();
BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
//PrintWriter pw=new PrintWriter(new FileWriter("云_复制.txt"),true);
BufferedWriter bw=new BufferedWriter(new FileWriter("云_复制.txt"));
//获取客户端ip地址
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip);
String line=null;
while((line=brIn.readLine())!=null){
//pw.println(line);
bw.write(line);
}
//向客户端返回提示信息
PrintWriter pwOut=new PrintWriter(s.getOutputStream(),true);
pwOut.println("上传文件成功!!!");
bw.close();
//pw.close();
s.close();
}
}
代码练习5:自定义服务端,IE浏览器为客户端
/*服务端 服务端服务端服务端
*/
import java.net.*;
import java.io.*;
class TcpServerSocket2 {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(10010);
while (true) {
Socket s = ss.accept();
BufferedOutputStream out = new BufferedOutputStream(s.getOutputStream());
System.out.println(s.getInetAddress().getHostAddress());
//PrintWriter pw = new PrintWriter(out, true);
//pw.println("欢迎访问我的服务器!");
//out.write(123456);
// 建立图片读取流对象,并写入ServerSocket流中,图片70.4kb
BufferedInputStream bis= new BufferedInputStream(new FileInputStream("1psu.jpg"));
byte[] buf = new byte[1024*1024];
int len = 0;
while ((len = bis.read(buf)) != -1) {
out.write(buf, 0, len);
}
bis.close();
out.close();
//pw.close();
s.close();
}
}
}