Posted on 2007-04-20 22:54
chenweicai 阅读(365)
评论(0) 编辑 收藏
-
public class ServerSocket
- extends Object
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
服务器套接字的实际工作由 SocketImpl
类的实例执行。应用程序可以更改创建套接字实现的套接字工厂来配置它自身,从而创建适合本地防火墙的套接字。
-
public class Socket
- extends Object
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器之间的通信端点。
套接字的实际工作由 SocketImpl
类的实例执行。应用程序通过更改创建套接字实现的套接字工厂可以配置它自身,以创建适合本地防火墙的套接字。
/**
* 为了验证我们的服务器程序能否正常工作,还必须有一个客户端程序与之通信。
* 我们也没必要每次都要编写客户端程序来测试。其实, Windows提供的telnet
* 程序,就是一个TCP客户端程序,我们只要使用telnet程序对我们的服务器程序
* 进行测试,我们只要在运行telnet程序时指定所要连接的服务器程序的IP地址
* 和端口号,telnet程序就会按照指定的参数去与服务器程序进行连接。建立连接
* 后,在telnet程序窗口中键入的内容会发送到服务器,从服务器端接收到的数据
* 会显示在窗口中。
* 先运行TcpServer程序,然后在命令行中输入 telnet 10.214.16.80 8001
* 就会执行
*/
// TCP 服务端程序
public class TcpServer {
public static void main(String[] args){
try{
//建立一个在8001端口上等待连接的ServerSocket对象
ServerSocket ss = new ServerSocket(8001);
//侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞,返回客户端套接字
Socket s = ss.accept();
InputStream ips = s.getInputStream();//返回此套接字的输入流
OutputStream ops = s.getOutputStream();//返回此套接字的输出流
//将字节从指定的字节数组写入此输出流
ops.write("chenweicai...".getBytes());
// byte[] buf = new byte[1024];
// // 从输入流中读取一定数量的字节并将其存储在缓冲区数组buf中
// int len = ips.read(buf);
// System.out.println(new String(buf, 0, len));
//由于telent只要输入就发送,而不管有没有回车,所以只有第一个字符被发送。
//java提供了一个BufferedReader类,可以帮助我们按行处理输入流。
BufferedReader br = new BufferedReader (new InputStreamReader(ips));
System.out.println("The message comes form client: " + br.readLine());//输出客户端输入的内容
br.close();//关闭包装类,会自动关闭包装类中所包装的底层类,所以不用调用ips.close().
// ips.close();
ops.close();
s.close();
ss.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
给个具体的例子
/**
* 实现服务器和客户端之间的对话功能
*/
public class Servicer implements Runnable {
Socket s;
public Servicer (Socket s){
this.s = s;
}
public void run(){
try {
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos = new DataOutputStream(ops);
while(true){
String strWord = br.readLine();
System.out.println("From Client StrWord: " + strWord + strWord.length());
if(strWord.equalsIgnoreCase("quit"))
break;
String strEcho = (new StringBuffer(strWord).reverse()).toString();
dos.writeBytes(strWord + "---->" + strEcho + System.getProperty("line.separator"));
}
br.close();
dos.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args){
try{
ServerSocket ss = new ServerSocket(8001);
while(true){
Socket s = ss.accept();
new Thread(new Servicer(s)).start();
}
}catch(Exception e){
}
}
}
public class TcpClient {
public static void main(String[] args){
try{
if(args.length < 2){
System.out.println("Usage: java TcpClient ServerIP ServerPort");
return;
}
Socket s = new Socket(InetAddress.getByName(args[0]), Integer.parseInt(args[1]));
InputStream ips = s.getInputStream();
OutputStream ops = s.getOutputStream();
BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
DataOutputStream dos = new DataOutputStream(ops);
BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
while(true){
String strWord = brKey.readLine();
dos.writeBytes(strWord + System.getProperty("ling.separator"));
if(strWord.equalsIgnoreCase("quit"))
break;
else
System.out.println(brNet.readLine());
}
dos.close();
brNet.close();
brKey.close();
s.close();
}catch (Exception e){
}
}
}