TCP写的一个点对点的聊天程序练习,可是总是有问题,连接上不能输入,求大神帮助
程序代码:
/**
* @author 小南
* 客户端
*/
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String args[]) throws Exception{
Socket s = new Socket("172.0.0.1",5003);
System.out.println("client connect is ok");
Thread.sleep(2000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader netin = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter netou = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String rd = null;
rd = br.readLine();
while(rd!="bye") {
netou.write(rd);
netou.flush();
System.out.println("Server:" + netin.readLine());
rd = br.readLine();
}
br.close();
netin.close();
netou.close();
s.close();
}
}
这里是服务器端* @author 小南
* 客户端
*/
import java.net.*;
import java.io.*;
public class TCPClient {
public static void main(String args[]) throws Exception{
Socket s = new Socket("172.0.0.1",5003);
System.out.println("client connect is ok");
Thread.sleep(2000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader netin = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter netou = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String rd = null;
rd = br.readLine();
while(rd!="bye") {
netou.write(rd);
netou.flush();
System.out.println("Server:" + netin.readLine());
rd = br.readLine();
}
br.close();
netin.close();
netou.close();
s.close();
}
}
程序代码:
/**
* @author 小南
* 服务器端
*/
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String args[]) throws Exception{
ServerSocket ss= new ServerSocket(5003);
Socket s = new Socket();
s = ss.accept();
Thread.sleep(2000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader netin = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter netou = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String rd = null;
rd = br.readLine();
while(rd!="bye") {
netou.write(rd);
netou.flush();
System.out.println("Client:" + netin.readLine());
rd = br.readLine();
}
br.close();
netin.close();
netou.close();
s.close();
ss.close();
}
}
* @author 小南
* 服务器端
*/
import java.net.*;
import java.io.*;
public class TCPServer {
public static void main(String args[]) throws Exception{
ServerSocket ss= new ServerSocket(5003);
Socket s = new Socket();
s = ss.accept();
Thread.sleep(2000);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader netin = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter netou = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String rd = null;
rd = br.readLine();
while(rd!="bye") {
netou.write(rd);
netou.flush();
System.out.println("Client:" + netin.readLine());
rd = br.readLine();
}
br.close();
netin.close();
netou.close();
s.close();
ss.close();
}
}
连接正常,但是不能通话,实在找不到问题,求大神解决
----------------解决方案--------------------------------------------------------
本人前几天刚写了一个,虽说不是你要的那种聊天,发出来,让你参考一下。。
客户端:
package newpackage;
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class Client {
BufferedReader in = null;
PrintWriter out = null;
Socket socket = null;
String message = null;
Scanner cin = new Scanner(System.in);
public static void main(String[] args) throws Exception, IOException {
new Client(new Socket("127.0.0.1", 8880));
}
public Client(Socket socket) {
this.socket = socket;
try {
in = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
// init receiver thread
Receiver receiver = new Receiver();
Thread tReceiver = new Thread(receiver);
tReceiver.start();
// init sender thread
Send send = new Send();
Thread tsend = new Thread(send);
tsend.start();
}
public void printMenu() {
System.out.println("注册的命令<register@name=用户名/>");
System.out.println("登陆的命令<login@name=用户名/>");
System.out.println("发送信息的命令<message@from=用户名@to=用户名@message=message>");
System.out.println("注销的命令<logout@name=用户名/> ");
}
private class Send implements Runnable {
@Override
public void run() {
printMenu();
while (cin.hasNext()) {
String mes = cin.next();
out.println(mes);
out.flush();
System.out.print(mes);
}
}
}
private class Receiver implements Runnable {
@Override
public void run() {
try {
while (true) {
message = in.readLine();
System.out.println(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
服务器端:
package newpackage;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
public class Server {
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(8880);
while(true){
Socket socket=server.accept();
System.out.println("hello");
SocketHandle handle=new SocketHandle(socket);
Thread thread=new Thread(handle);
thread.start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
package newpackage;
import ch3.*;
import java.io.*;
import java.net.Socket;
import java.util.*;
public class SocketHandle implements Runnable {
static boolean isLogin,state;
static List<String>l=new ArrayList<String>();
static HashMap cl=new HashMap();
private Socket socket;
BufferedReader br;
PrintWriter pw;
// HashMap<Integer,String> hm;
public SocketHandle( Socket socket){
this.socket=socket;
try{
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw=new PrintWriter(socket.getOutputStream());
}catch(Exception e){
e.printStackTrace();
}
}
public void writera(PrintWriter pw,String getmess)throws Exception{
if(getmess.contains("register")){
int t=getmess.indexOf("=");
String getm=getmess.substring(t+1,getmess.length()-2);
if(l.contains(getm)){
pw.println("<result command=”register” state=”error” message=”” />");
pw.flush();
}else{
l.add(getm);
System.out.println(getm);
pw.println(" <result command=”register” state=”ok” />");
pw.flush();
}
}else if(getmess.contains("login")){
System.out.println("login");
int t=getmess.indexOf("=");
String getm=getmess.substring(t+1,getmess.length()-2);
System.out.println(getm+"dfdfdfddfdf"+getm.equals(l.get(0)));
if(!state&&isOr(getm)){
pw.println("<result command=” login ” state=”ok” />");
pw.flush();
isLogin=true;
try{
cl.put(getm, socket);
}catch(Exception e){
e.printStackTrace();
}
}
else {
pw.println("<result command=”login” state=”error” message=”” />;");
pw.flush();
}
}else if(getmess.contains("message")){
if(isLogin){
int i1=getmess.indexOf("to");
int i2=getmess.lastIndexOf("@");
String str=getmess.substring(i1+3, i2);
System.out.println("hhhhhhhhhh"+str);
if(cl.containsKey(str)){
pw.println("<result command=” message ” state=”ok” />;");
pw.flush();
sendmessage(str,getmess);
}else{
pw.println("你要发送的用户没有注册");
pw.flush();
}
// hm.put(socket.getPort(), getmess);
}else{
pw.println("请登录。。。。。。");
pw.flush();
}
}else if(getmess.contains("logout")){
if(!state){
int t=getmess.indexOf("=");
String getm=getmess.substring(t+1,getmess.length()-2);
pw.println("<result command=” logout ” state=”ok” />");
pw.flush();
l.remove(getm);
}
else {
pw.println("<result command=”loginout” state=”error” message=”” />");
pw.flush();
}
}else{
pw.println("输入信息有误");
pw.flush();
}
}
public boolean isOr(String mess){
for(int j=0;j<l.size();j++){
if(mess.equals(l.get(j)))return true;
}
return false;
}
@Override
public void run() {
try{
while(!state){
String getmess=br.readLine();
writera(pw,getmess);
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{
pw.close();
br.close();
socket.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
private void sendmessage(String name ,String mess)throws Exception {
Socket dos=(Socket)cl.get(name);
PrintWriter pw=new PrintWriter(dos.getOutputStream());
pw.println(mess);
pw.flush();
System.out.println("怎么了,");
System.out.println(cl.size());
}
}
----------------解决方案--------------------------------------------------------
回复 2楼 whhguo
我想问一下,这个发送数据必须要用PrintWriter做通道么?用BufferedWriter里面的Write做发送不行么?我看你们都是用PrintWriter的 ----------------解决方案--------------------------------------------------------
行的。。。。。
----------------解决方案--------------------------------------------------------