一个简易聊天工具,测试都还Ok,就是在控制台输入中文的时候会带拼音,有没有技术大佬能指正,没有分数了,只能这么点了~客户端
public class Client {
private Socket client;
public Client() {
try {
client=new Socket("localhost",8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
GetServerInfoHandler handler=new GetServerInfoHandler(client);
Thread thread=new Thread(handler);
thread.setDaemon(true);
thread.start();
try {
PrintWriter writer=new PrintWriter(client.getOutputStream());
System.out.println("请输入你的昵称(不少于2位):");
Scanner sc=new Scanner(System.in);
String nickName="";
while(nickName.length()<2){
System.out.println("请输入你的昵称:");
nickName=sc.nextLine().trim();
}
System.out.println("你好!"+nickName+"可以聊天啦");
while(true){
System.out.println(nickName+":"+sc.nextLine());
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
class GetServerInfoHandler implements Runnable{
private Socket socket;
public GetServerInfoHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
while(true){
System.out.println(reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client().start();
}}
服务端
public class Server {
private ServerSocket server;
private ExecutorService threadPool;
private Vector<PrintWriter> allOut;
private BlockingQueue<String> messageQueue;
public Server() {
try {
server=new ServerSocket(8088);
threadPool=Executors.newCachedThreadPool();
allOut=new Vector<PrintWriter>();
messageQueue=new LinkedBlockingQueue<String>();
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
try {
SendMsgToAllClientHandler sendThread=new SendMsgToAllClientHandler();
Thread thread=new Thread(sendThread);
thread.setDaemon(true);
thread.start();
while(true){
System.out.println("等待客户端连接");
Socket socket=server.accept();
System.out.println("一个客户端连接。。");
ClientHandler handler=new ClientHandler(socket);
threadPool.execute(handler);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public class ClientHandler implements Runnable{
private Socket client;
public ClientHandler(Socket client) {
this.client = client;
}
public void run() {
PrintWriter writer=null;
try {
writer=new PrintWriter(client.getOutputStream());
allOut.add(writer);
BufferedReader reader=new BufferedReader(
new InputStreamReader(client.getInputStream()));
while(true){
messageQueue.offer(reader.readLine(),5,TimeUnit.SECONDS);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
synchronized (allOut) {
allOut.remove(writer);
} }
}
}
class SendMsgToAllClientHandler implements Runnable{
public void run() {
while(true){
if(messageQueue.peek()!=null){
String str=messageQueue.poll();
synchronized (allOut) {
for(PrintWriter writer:allOut){
writer.println(str);
writer.flush();
}
}
}
try {
if(messageQueue.size()==0){
Thread.sleep(250);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Server server=new Server();
server.start();
}
}控制台技术java聊天工具测试
public class Client {
private Socket client;
public Client() {
try {
client=new Socket("localhost",8088);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
GetServerInfoHandler handler=new GetServerInfoHandler(client);
Thread thread=new Thread(handler);
thread.setDaemon(true);
thread.start();
try {
PrintWriter writer=new PrintWriter(client.getOutputStream());
System.out.println("请输入你的昵称(不少于2位):");
Scanner sc=new Scanner(System.in);
String nickName="";
while(nickName.length()<2){
System.out.println("请输入你的昵称:");
nickName=sc.nextLine().trim();
}
System.out.println("你好!"+nickName+"可以聊天啦");
while(true){
System.out.println(nickName+":"+sc.nextLine());
writer.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
class GetServerInfoHandler implements Runnable{
private Socket socket;
public GetServerInfoHandler(Socket socket) {
this.socket = socket;
}
public void run() {
try {
BufferedReader reader=new BufferedReader(
new InputStreamReader(socket.getInputStream()));
while(true){
System.out.println(reader.readLine());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client().start();
}}
服务端
public class Server {
private ServerSocket server;
private ExecutorService threadPool;
private Vector<PrintWriter> allOut;
private BlockingQueue<String> messageQueue;
public Server() {
try {
server=new ServerSocket(8088);
threadPool=Executors.newCachedThreadPool();
allOut=new Vector<PrintWriter>();
messageQueue=new LinkedBlockingQueue<String>();
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(){
try {
SendMsgToAllClientHandler sendThread=new SendMsgToAllClientHandler();
Thread thread=new Thread(sendThread);
thread.setDaemon(true);
thread.start();
while(true){
System.out.println("等待客户端连接");
Socket socket=server.accept();
System.out.println("一个客户端连接。。");
ClientHandler handler=new ClientHandler(socket);
threadPool.execute(handler);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public class ClientHandler implements Runnable{
private Socket client;
public ClientHandler(Socket client) {
this.client = client;
}
public void run() {
PrintWriter writer=null;
try {
writer=new PrintWriter(client.getOutputStream());
allOut.add(writer);
BufferedReader reader=new BufferedReader(
new InputStreamReader(client.getInputStream()));
while(true){
messageQueue.offer(reader.readLine(),5,TimeUnit.SECONDS);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
synchronized (allOut) {
allOut.remove(writer);
} }
}
}
class SendMsgToAllClientHandler implements Runnable{
public void run() {
while(true){
if(messageQueue.peek()!=null){
String str=messageQueue.poll();
synchronized (allOut) {
for(PrintWriter writer:allOut){
writer.println(str);
writer.flush();
}
}
}
try {
if(messageQueue.size()==0){
Thread.sleep(250);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
Server server=new Server();
server.start();
}
}控制台技术java聊天工具测试
解决方案 »
- ObjectInputStream如果从txt文件中读取2个java类?ObjectInputStream的实例也没有next方法呀?如何判断……
- 关于跨语言衔接问题
- 字符串分析效率,求助!
- 如何用java实现linux的消息队列通讯
- jcreator 4.0中用Basic Java Application建立工程问题!!!!
- 如何在Java中替换自己实现的Security Policy!!
- 再谈一个设计理念,献给所有想提高的java程序员!(续第一篇)
- 关于sybase连接的jdbc url如何描述?在线等!
- JAVA ,请问一个问题帮忙,我新手!55~~
- 谁知道JDBC中thin和oci8这两个driver有什么区别,server_side driver怎么用?
- 不明白这道题的题意 求指点。。。
- [分享]Java进程内存分配
看你的截图你用的是Eclipse中的Console做的输入,用这个的确会有限制.
这个我以前也做过,遇到跟你的问题是一样的。你可以自己做一个聊天框,别在控制台输入就好了。现在也没有聊天软件是用控制台输入聊天的你说是吧
看来是我太高估了java控制台的功能啦当然,现在的聊天工具都是有自己的聊天框的
看你的截图你用的是Eclipse中的Console做的输入,用这个的确会有限制.
好吧,之前不知道,现在知道了又想起前人说的话,java的控制台做的真是不咋地