简单的TCP服务器程序
·TCP服务器程序必须先启动运行,TCP客户程序才能连接上TCP服务器。
import java.net.*;
import java.io.*;
public class TcpServer {
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args) throws Exception {
// TODO: Add your code here
ServerSocket ss = new ServerSocket(8001);
Socket s =ss.accept();
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
OutputStream out = s.getOutputStream();
String strInfo = "welcome to www.it315.org!";
out.write(strInfo.getBytes());
//byte [] buf = new byte[1024];
//int len = in.read(buf);
String result = br.readLine();
//System.out.println(new String(buf,0,len));
System.out.println (result);
//in.close();
br.close();
out.close();
s.close();
ss.close();
}
}
·使用Windows提供的telnet程序测试TCP服务器程序。
在dos中输入:telnet 192.168.1.100 8001,就可以连接到我们本地计算机的8001端口,接收服务器程序发出的欢迎信息“welcome to www.it315.org!”
·使用BufferedReader包装类,从网络输入流中读取一行文本。
InputStream in = s.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String result = br.readLine();
·如何打开telnet程序的本地回显功能。
在dos中输入:telnet 进入telnet的设置界面,然后输入:set localecho 设置telnet的本地回写功能。
完善的TCP服务器程序模型
编程实例:
服务器程序能够同时与多个客户端回话,客户端每次向服务器发送一行字符文本,
服务器就将这行字符文本中的所有字符反向排列后回送给客户端,当客户端向服务器
发送的一行字符文本内容为“quit”时,服务器结束与客户端的会话。这里的客户端
是借用Windows的telnet程序完成的。
import java.net.*;
public class ReverseServer {
/**
* Method main
*
*
* @param args
*
*/
public static void main(String[] args) {
// TODO: Add your code here
try{
ServerSocket ss =new ServerSocket(8001);
boolean isOpen = true;
while(isOpen){
Socket s = ss.accept();
new Thread(new Service(s)).start();
}
ss.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;
public class Service implements Runnable {
private Socket s = null;
public Service(Socket s) {
this.s = s;
}
/**
* Method run
*
*
*/
public void run() {
// TODO: Add your code here
try{
InputStream in = s.getInputStream();
OutputStream out = s.getOutputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
PrintWriter pw = new PrintWriter(out,true);
boolean isOpen = true;
while(isOpen){
String strLine = br.readLine();
System.out.println (strLine);
if(strLine.equalsIgnoreCase("quit"))
{
return;
}
String strEcho = new StringBuffer(strLine).reverse().toString();
pw.println(strLine+"--->"+strEcho);
}
br.close();
pw.close();
s.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
注意:以上程序基本实现了完善的TCP服务器程序的框架了,有个奇怪的现象是当我们在telnet中输入字符错了退格再输,
telnet会将这些像退格键的特殊字符都传给服务器程序处理。奇怪的现象就是程序接收了这些特殊的字符导致的。
TCP服务器程序模型的编写要点:
-TCP服务器程序要想能接收多个客户端连接,需要循环调用ServerSocket.accept方法。
-服务器程序与每个客户端连接的会话过程不能互相影响,需要在独立的线程中运行。
-一个线程服务器对象与一个服务器端Socket对象相关联,共同来完成与一个客户端的会话。
如何检测和解决端口冲突问题
·使用netstat命令查看当前正在使用的TCP端口号。--netstat -na
·通过一个配置参数来指定TCP服务程序所使用端口号。
ServerSocket ss =new ServerSocket(8001);将“8001”写成一个外部参数的形式传给程序
·将用户所指定的端口号保存到一个文件中,当服务器程序下次启动运行时,直接从文件中读取那个端口号。