读书人

经验13-网络编程4-TCP协议案例分析

发布时间: 2012-09-19 13:43:54 作者: rapoo

心得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中获取,所以此处也不用关这两个流

}

}

读书人网 >编程

热点推荐