Clientc=Clients.get(i);
c.send(str,this.num);
}
}
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
try{
s.close();
ss.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
}
//ThreadTCPClient
importjava.io.*;
import.*;
/**
*多线程的客服端的实现
*
*@author卢富毓(fly)
*
*/
publicclassThreadTCPClient{
Sockets=null;
BufferedReaderinfromUser=null;
PrintWriterouttoServer=null;
BufferedReaderinfromServer=null;
booleanb=true;
ThreadRec=newThread(newReciver());//创建Rec线程。
实现接收来自客户端的消息
publicstaticvoidmain(String[]args)throwsException{
newThreadTCPClient().connect();//启动客户端与服务器的连接
}
/**
*connect()方法用来具体实现C/S的连接以及对消息的发送
*
*@throwsIOException
*@throwsException
*/
publicvoidconnect()throwsIOException,Exception{
s=newSocket("127.0.0.1",8999);//建立与服务器的连接
infromUser=newBufferedReader(newInputStreamReader(System.in));
//从键盘读入字符串
outtoServer=newPrintWriter(s.getOutputStream());
//向服务器写入
infromServer=newBufferedReader(newInputStreamReader(
s.getInputStream()));
//从服务器得到信息
Rec.start();//启动线程
Stringstr="hello";
while(b){
outtoServer.println(str);
outtoServer.flush();
str=infromUser.readLine();
if(str.equals("exit")){
b=false;
}
}
s.close();
}
/**
*内部类Reciver实现线程控制。
并负责消息的接收
*
*/
classReciverimplementsRunnable{
publicvoidrun(){
try{
while(b){
Stringstr=infromServer.readLine();
System.out.println("Client"+str);
}
}catch(SocketExceptione){
System.out.println("退出了,bye!
");
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}
命令提示符运行简单聊天程序,结果如下:
客户端一
客户端二:
服务器:
(两个客户端连接成功)
//用到了多线程技术通过服务器来实现信息的转发(个人觉得服务器在理就是一个中介。
)
B、JavaUDPSocket编程
概要:
本实验,会通过增强信息处理和多线程来进行的,在信息处理中用到了正则表达式的内容
步骤:
本程序是增强信息与多线程合在一起处理的,所以只写了一个C/S程序
代码如下:
//ThreadUDPServer
importjava.io.*;
import.*;
/**
*UDPSocket之Server端
*@author卢富毓
*
*/
publicclassThreadUDPServer{
/**
*通过线程来控制多个UDPClient端的连接
*/
DatagramSocketserversocket=null;
publicstaticvoidmain(String[]args)throwsException{
newThreadUDPServer().start();
}
publicvoidstart(){
//start来进行多个客户端的创建
try{
//新建一个线程
clientc=newclient();
//线程中的start方法开始线程的执行
newThread(c).start();
}catch(SocketExceptione){
e.printStackTrace();
}
}
classclientimplementsRunnable{
client()throwsSocketException{
//构造方法实现接口的创建
serversocket=newDatagramSocket(6789);
}
@Override
publicvoidrun(){
try{
while(true){
byte[]senddata=newbyte[1024];
byte[]recvdata=newbyte[1024];
DatagramPacketrecvpacket=newDatagramPacket(recvdata,
recvdata.length);
serversocket.receive(recvpacket);
Stringstr=newString(recvpacket.getData());
//连个正则表达式来进行信息的处理
if(str.matches("[abc].*")){
senddata="thisStringbegainwithaorborc".getBytes();
}elseif(str.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}.*")){
senddata=("thisisaIPAddress:
"+str).getBytes();
}else{
senddata=str.toUpperCase().getBytes();
}
//数据打包,进行发送。
DatagramPacketsendpacket=newDatagramPacket(senddata,
senddata.length,recvpacket.getAddress(),
recvpacket.getPort());
serversocket.send(sendpacket);
senddata=null;
recvdata=null;
}
}catch(IOExceptione){
e.printStackTrace();
}finally{
serversocket.close();
}
}
}
}
//ThreadUDPClient
importjava.io.*;
import.*;
/**
*UDPSocket之Client端
*@author卢富毓
*
*/
publicclassThreadUDPClient{
/**
*@paramargs
*@throwsIOException
*/
publicstaticvoidmain(String[]args)throwsIOException{
//创建一个client端的接口
DatagramSocketclientsocket=newDatagramSocket();
//用一个缓冲区来暂放用户输入的字符集
BufferedReaderinfromuser=newBufferedReader(newInputStreamReader(
System.in));
Stringstr=infromuser.readLine();
while(!
str.equals("bye")){
byte[]senddata=newbyte[1024];
byte[]recvdata=newbyte[1024];
senddata=str.getBytes();
//对数据进行打包,在这个数据包中放入Address等相应信息
DatagramPacketsendpacket=newDatagramPacket(senddata,
senddata.length,newInetSocketAddress("127.0.01",6789));
clientsocket.send(sendpacket);
//创建接受数据的packet
DatagramPacketrecvpacket=newDatagramPacket(recvdata,
recvdata.length);
clientsocket.receive(recvpacket);
str=newString(recvpacket.getData());
//接受数据进行打印
System.out.println("FromUDPServer:
"+str);
//又读入一行
str=infromuser.readLine();
senddata=null;
recvdata=null;
}
infromuser.close();
clientsocket.close();
}
}
Eclipse运行结果如下:
//三个客户端和一个服务器端
//客户端1是通过正则表达式来检测一串数字是不是IP地址
//客户端2是通过正则表达式来检测一字符串是不是以abc之一开头的
//客户端3是用来进行不满足上两个情形的时候,就像字符串转换为大写
C、建立简单Web服务器
概要:
本实验,会通过增强信息处理和多线程来进行的,在信息处理中用到了正则表达式的内容
步骤:
通过建立一个简单的WEB服务器来对http传送消息格式的理解。
实验内容很简单,关键是理解http协议消息请求与响应。
尤其是对html响应消息的理解对于本程序来说是重中之重。
因为,Client端由浏览器代替,所以不需要对消息请求的头格式了解多深。
代码如下:
importjava.io.*;
import.*;
/**
*一个非常简单的WebServer服务器。
*@author卢富毓(fly)
*
*/
publicclassWe