心得13--网络编程4-TCP协议案例分析
一:简单案例:
1. 客户端
packagecom.Tcp;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.Socket;
importjava.net.UnknownHostException;
public classClient {
/**
*@param args
*@throws IOException
* @throwsUnknownHostException
*/
public static void main(String[] args) throwsException {
// 建立客户端服务器
Socket s = newSocket("192.168.49.200",9008);
// 获取输出流对象
OutputStream out = s.getOutputStream();
out.write("我来了!!".getBytes());
//读取服务器发过来的信息
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
System.out.println(newString(buf,0,is.read(buf)));
s.close();
}
}
2.发送端
packagecom.Tcp;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.ServerSocket;
importjava.net.Socket;
public classServer {
/**
*@param args
*@throws Exception
*/
public static void main(String[] args) throwsException {
// 建立客户端服务器
ServerSocket ss = new ServerSocket(9008);
//调用accept()方法接收客户端发过来的文件
Socket s = ss.accept();
//获取输出流对象
InputStream is = s.getInputStream();
byte[] buf = new byte[1024];
String ip =s.getInetAddress().getHostAddress();
System.out.println(ip+":"+newString(buf,0,is.read(buf)));
//服务器端向客户返回信息
OutputStream out = s.getOutputStream();
out.write("我收到了!!".getBytes());
s.close();
ss.close(); //关了s与ss也就关了out、in,因为out、in是从s、ss中获取的
}
}
二:键盘输入案例:
1.客户端
package com.Tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client1 {
/**
* @param 客户端通过键盘录入信息,发送到服务器端;服务器端收到信息后,将信息转为大写返回给客户端。
* @throws IOException
* @throws UnknownHostException
*/
publicstatic void main(String[] args) throws Exception {
// 建立客户端服务器
Sockets = new Socket("192.168.49.200",9008);
//获取输出流对象
OutputStreamout = s.getOutputStream();
//封装获取的输入流和输出流
System.out.println("请您输入:");
BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriterbwOut = new BufferedWriter(new OutputStreamWriter(out));
BufferedReaderbrIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
Stringline = null;
while((line=br.readLine())!=null){
if(line.equals("over")){
break;
} //设置循环结束条件,也是退出命令的条件
bwOut.write(line);
bwOut.newLine(); // 换新行,字符缓冲流内部不知道换行
bwOut.flush(); //必须刷新,否则用的缓冲流输入输出会不显示
System.out.println("Server:"+brIn.readLine());
}
br.close();
s.close(); //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流
}
}
2. 发送端
package com.Tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class Server1 {
/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
publicstatic void main(String[] args) throws Exception {
// 建立客户端服务器
ServerSocketss = new ServerSocket(9008);
Sockets = ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"ServerSocket已连接!");
//获取输出流对象
InputStreamis = s.getInputStream();
//封装获取的输入流和输出流
BufferedReaderbrIn = new BufferedReader(new InputStreamReader(is));
BufferedWriterbwOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
Stringline = null;
while((line=brIn.readLine())!=null){
if(line.equals("over")){
break;
} // 这个if()语句虽然与前面例子不同放到了while循环的最前面,但是跟放到最后的效果一样,不影响程序的正确性
bwOut.write("你好Client,您的消息已收到!");
bwOut.newLine();
bwOut.flush();
System.out.println("Client:"+line);
}
s.close();
ss.close(); //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流
}
}
三、改造版案例(运用PrintWriter类来调用它的println()方法,简化代码,去除刷新和换行操作)
1.Client客户端
packagecom.Tcp;
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStream;
importjava.io.PrintWriter;
importjava.net.Socket;
importjava.net.UnknownHostException;
publicclassClient2 {
/**
* @param 客户端通过键盘录入信息,发送到服务器端;服务器端收到信息后,将信息转为大写返回给客户端。
* @throws IOException
* @throws UnknownHostException
*/
public staticvoid main(String[] args)throws Exception {
// 建立客户端服务器
Socket s = newSocket("192.168.49.200",9008);
// 获取输出流对象
OutputStreamout = s.getOutputStream();
//封装获取的输入流和输出流
System.out.println("请您输入:");
BufferedReaderbr = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw= new PrintWriter(out,true); //这里用PrintWriter类代替Buffered可以不用缓冲与换行的操作
BufferedReaderbrIn = new BufferedReader(newInputStreamReader(s.getInputStream()));
String line = null;
while((line=br.readLine())!=null){
if(line.equals("over")){
break;
} //设置循环结束条件,也是退出命令的条件
pw.println(line); //但是这里不能调用writer()方法,必须调用PrintWriter类的println()方法
System.out.println("Server:"+brIn.readLine());
}
br.close();
s.close(); //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流
}
}
Server服务器端:
package com.Tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class Server2 {
/**
* @param args
* @throws IOException
* @throws UnknownHostException
*/
public static void main(String[]args) throws Exception {
// 建立客户端服务器
ServerSocket ss = newServerSocket(9008);
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"ServerSocket已连接!");
// 获取输出流对象
InputStream is =s.getInputStream();
//封装获取的输入流和输出流
BufferedReader brIn = newBufferedReader(new InputStreamReader(is));
PrintWriter pw = newPrintWriter(s.getOutputStream(),true);
String line = null;
while((line=brIn.readLine())!=null){
if(line.equals("over")){
break;
} // 这个if()语句虽然与前面例子不同放到了while循环的最前面,但是跟放到最后的效果一样,不影响程序的正确性
pw.println("你好Client,您的消息已收到!");
System.out.println("Client:"+line);
}
s.close();
ss.close(); //这里的bwOut、bwInt是从out、in中获取,而out、in又是从s中获取,所以此处也不用关这两个流
}
}