---------------------- <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();
}
}
}