package src;
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer
{
public static void main(String args[])
{
Hashtable<String, DataOutputStream> userList = new Hashtable<String, DataOutputStream>();
String name;
DataInputStream dis;
DataOutputStream dos;
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
try
{
ServerSocket ss = new ServerSocket(8888);
new MyServerWriter(br,userList,"系统管理员").start();//开启写的线程
while (true)
{
Socket s = ss.accept();//和客户端建立连接
dis = new DataInputStream(s.getInputStream());//封装输入流对象
dos = new DataOutputStream(s.getOutputStream());//封装输出流对象
name = dis.readUTF();//通过使用dis读取服务器放入"线路"里的信息。堵塞状态,除非读取到信息
System.out.println(s.getInetAddress()+":"+name+"连接成功!");
userList.put(name,dos);//容器接受键值对
new MyServerReader(name, dis, userList).start();//启动写读的线程
}
}
catch (Exception e)
{
System.out.println("服务器正在运行,请先退出再试");
}
}
}
class MyServerReader extends Thread
{
private String name;
private DataInputStream dis;
private Hashtable<String, DataOutputStream> userList;
public MyServerReader(String name, DataInputStream dis,Hashtable<String, DataOutputStream> userList)
{
this.name = name;
this.dis = dis;
this.userList = userList;
}
public void run()
{
String message;
try
{
sendMessage("************欢迎 "+ name + " 进入郑云飞聊天室!****************");
//用户成功进入聊天室后,提示用户输入消息
((DataOutputStream) userList.get(name)).writeUTF("请输入消息:");//通过dos向当前线路写入信息
while (true)
{
message = dis.readUTF();//通过使用dis读取服务器写入线路里的信息,堵塞状态,除非读到信息
if(message.equals("88"))//当前用户离开
{
userList.remove(name);//将当前用户从容器中移除
//打印消息
sendMessage( "**************"+name + "******离开了郑云飞聊天室**************");
break;
}
else if(message.length()>0)//消息不为空,就群发消息
{
sendMessage( name+"说:"+message);
}
}
}
catch (Exception e)
{
System.out.println(name+"中断了服务器");
}
}
public void sendMessage(String message)
{
//迭代器遍历hashtable中的values属性值,即我们存放的DataOutputStream流(用户输入的消息内容)
Iterator<DataOutputStream> it=userList.values().iterator();
while(it.hasNext())
{
try
{
it.next().writeUTF(message);
}
catch (IOException e)
{
//捕获因用户中断而写入的错误
}
}
}
}
class MyServerWriter extends Thread
{
private Hashtable<String, DataOutputStream> userList;
private BufferedReader br;
private String name;
public MyServerWriter(BufferedReader br,Hashtable<String, DataOutputStream> userList, String name)
{
super();
this.br = br;
this.userList = userList;
this.name = name;
}
public void run()
{
String message;
System.out.println("发送群消息:");
try
{
while(true)
{
message=br.readLine();//从键盘输入要发送的群消息
//服务器的控制台显示服务器名:消息内容
System.out.println(name+":"+message);//输出群消息
sendMessage("-----------"+name+":"+message);//群发消息到所有的用户控制台
if(message.equals("88"))
{
System.out.println("系统管理员断开了服务器");
System.exit(0);
break;
}
}
}
catch(Exception e)
{
System.out.println("服务器中断连接,请稍后再试");
}
}
public void sendMessage(String message)//发送群消息
{
Iterator<DataOutputStream> it=userList.values().iterator();
while(it.hasNext())
{
try
{
it.next().writeUTF(message);
}
catch (IOException e)
{
//捕获因用户中断而写入的错误
}
}
}
}
package src;
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class FileClient extends Applet implements Runnable, ActionListener
{
Button 计算;
TextField 输入三边长度文本框, 计算结果文本框;
Socket socket = null;
DataInputStream in = null;
DataOutputStream out = null;
Thread thread;
public void init()
{
setLayout(new GridLayout(2, 2));
Panel p1 = new Panel(), p2 = new Panel();
计算 = new Button(" 计算");
输入三边长度文本框 = new TextField(12);
计算结果文本框 = new TextField(12);
p1.add(new Label("输入三角形三边的长度,用逗号或空格分隔:"));
p1.add(输入三边长度文本框);
p2.add(new Label("计算结果:"));
p2.add(计算结果文本框);
p2.add(计算);
计算.addActionListener(this);
add(p1);
add(p2);
}
public void start()
{
try
{ // 和小程序所驻留的服务器建立套接字连接:
socket = new Socket(this.getCodeBase().getHost(), 4331);
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}
catch (IOException e)
{
}
if (thread == null)
{
thread = new Thread(this);
thread.start();
}
}
public void run()
{
String s = null;
while (true)
{
try
{
s = in.readUTF();// 堵塞状态,除非读取到信息。
计算结果文本框.setText(s);
}
catch (IOException e)
{
计算结果文本框.setText("与服务器已断开");
break;
}
}
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == 计算)
{
String s = 输入三边长度文本框.getText();
if (s != null)
{
try
{
out.writeUTF(s);
}
catch (IOException e1)
{
}
}
}
}
}
package src;
import java.io.*;
import java.net.*;
import java.util.*;
import java.sql.*;
public class FileServer
{
public static void main(String args[])
{
ServerSocket server = null;
Socket you = null;
while (true)
{
try
{
server = new ServerSocket(4331);
}
catch (IOException e1)
{
System.out.println("正在监听"); // ServerSocket对象不能重复创建。
}
try
{
you = server.accept();
System.out.println("客户的地址:" + you.getInetAddress());
}
catch (IOException e)
{
System.out.println("正在等待客户");
}
if (you != null)
{
new Server_thread(you).start(); // 为每个客户启动一个专门的线程。
}
else
{
continue;
}
}
}
}
class Server_thread extends Thread
{
Socket socket;
Connection Con = null;
Statement Stmt = null;
DataOutputStream out = null;
DataInputStream in = null;
int n = 0;
String s = null;
Server_thread(Socket t)
{
socket = t;
try
{
in = new DataInputStream(socket.getInputStream());
out = new DataOutputStream(socket.getOutputStream());
}
catch (IOException e)
{
}
}
public void run()
{
while (true)
{
double a[] = new double[3];
int i = 0;
try
{
s = in.readUTF();// 堵塞状态,除非读取到信息。
StringTokenizer fenxi = new StringTokenizer(s, " ,");
while (fenxi.hasMoreTokens())
{
String temp = fenxi.nextToken();
try
{
a[i] = Double.valueOf(temp).doubleValue();
i++;
}
catch (NumberFormatException e)
{
out.writeUTF("请输入数字字符");
}
}
double p = (a[0] + a[1] + a[2]) / 2.0;
out.writeUTF(" "+ Math.sqrt(p * (p - a[0]) * (p - a[1]) * (p - a[2])));
sleep(2);
}
catch (InterruptedException e)
{
}
catch (IOException e)
{
System.out.println("客户离开");
break;
}
}
}
}
/**
* @author 郑云飞
*
*/
package src;
import java.io.*;
import java.net.Socket;
public class TestClient
{
public static void main(String[] args)
{
try
{
Socket s=new Socket("localhost",8888);
System.out.println("已经和服务器建立连接");
DataInputStream dis=new DataInputStream(s.getInputStream());
DataOutputStream dos=new DataOutputStream(s.getOutputStream());
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
/**
* 用户昵称不能为空
*/
boolean flag=true;//控制是否输入的标志
String name="";//用户昵称
while(flag)
{
flag=false;
System.out.println("请输入你的昵称:");
name = br.readLine();
if(name.equals(""))
{
System.out.println("昵称不能为空");
flag=true;
}
}
/**
* 启动两个读写线程
*/
new MyClientReader(name,dis).start();
new MyClientWriter(name,dos).start();
}
catch(Exception e)
{
System.out.println("服务器未响应,请稍后再试");//如果服务器为启动,会报此异常
}
}
}
class MyClientReader extends Thread
{
private DataInputStream dis;
private String name;
public MyClientReader(String name,DataInputStream dis)
{
super();
this.dis = dis;
this.name= name;
}
public void run()
{
String message;
try
{
while(true)
{
message=dis.readUTF();//读取用户发送的小心
if(message.indexOf(name)==0)//如果是本人发送的消息
{
//本人的控制台上显示的信息
System.out.println(message.substring(message.indexOf(":")+1)+"******发送成功*********");
System.out.println("请输入消息:");
}
else//让自己发送的消息发给除自己以外的所有其他人
{
System.out.println(message);
}
}
}
catch(Exception e)
{
System.out.println("服务器中断");
}
}
}
class MyClientWriter extends Thread
{
private DataOutputStream dos;
private String name;
public MyClientWriter(String name,DataOutputStream dos)
{
super();
this.dos = dos;
this.name=name;
}
public void run()
{
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String message;
try
{
dos.writeUTF(name);
while(true)
{
message=br.readLine();//接收从控制台输入的消息
if(message.equals(""))//处理空消息的情况
{
System.out.println("不能发送空消息");
System.out.println("请输入消息:");
}
dos.writeUTF(message);//输入的消息不为空,就将message写入到dos所关联的设备中
if(message.equals("88"))//处理自己输入"退出"的情况
{
System.out.println("自己下线,程序退出");
System.exit(0);
break;
}
}
}
catch(Exception e)
{
System.out.println("自己中断了程序");
}
}
}