是tcp字符流通信,但不知道哪儿出问题了,想要大老修改一下代码
这是客户端的
package Task1;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.OutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author 15122
*/
public class Client {
public String HOST_NAME;
public int HOST_PORT;
public Client(String Name,int Port){
HOST_NAME=Name;
HOST_PORT=Port;
}
public void startClient(){
Socket socket = null;
Scanner keyboardInput = new Scanner(System.in);
try
{ socket = new Socket("127.0.0.1", HOST_PORT);
System.err.println("Connection successful " );
}
catch (IOException e)
{ System.err.println("Client could not make connection: " + e);
System.exit(-1);
}
BufferedReader br;
BufferedWriter bw;
InputStreamReader isr;
OutputStream os;
InputStream is;
do{
try
{
os = socket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(os));
bw.write(HOST_NAME+" : "+keyboardInput.nextLine());
bw.newLine();
bw.flush();
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
info = br.readLine();
if (info != null) {
System.out.println(info);
} if(info==null){
is.close();
os.close();
bw.close();
br.close();
System.out.println("done");
}
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e)
{ System.err.println("Client error with chat: " + e);
}
}while(!"Exit".equals(keyboardInput.nextLine()));
try {
socket.close();
System.out.println("done1");
} catch (IOException ex) {
Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
这是服务器的
package Task1;
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* @author 15122
*/
public class Server {
public static final int PORT = 8888;
public Server(){
}
public void startServer(){
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(PORT);
System.out.println("Server started at "+ InetAddress.getLocalHost() + " on port " + PORT);
}
catch(IOException e){
System.err.println("Server can't listen on port: " + e);
System.exit(-1);
}
try{
while(true)
{
Socket socket = serverSocket.accept();
ServerThread serverThread = new ServerThread(socket);
serverThread.start();
InetAddress address = socket.getInetAddress();
System.out.println("Connection made with "+ address);
}
}
catch(IOException e){
System.err.println("Can't accept client connection: " + e);
}
System.out.println("Server finishing");
}
这是服务器线程
package Task1;
/**
*
* @author 15122
*/
import java.io.*;
import java.net.Socket;
public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;
OutputStream os = null;
PrintWriter pw = null;
String info;
info = "start";
try {
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
os = socket.getOutputStream();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
info = br.readLine();
do{
System.out.println( info);
bw.write(info);
bw.newLine();
bw.flush();
info =br.readLine();
}while(br.readLine()!=null);
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
do{
try {
if (pw != null)
pw.close();
if (os != null)
os.close();
if (is != null)
is.close();
if (isr != null)
isr.close();
if (br != null)
br.close();
if (socket != null)
socket.close();
System.out.println("done2");
} catch (IOException e) {
e.printStackTrace();
}
}while(info == null);
}
}
这是客户端1
package Task1;
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author 15122
*/
public class TestChat {
public static void main(String[] args) {
Client client1 = new Client("Client1",8888);
client1.startClient();
}
}
这是客户端2
```java
package Task1;
/**
*
* @author 15122
*/
public class TestChat1 {
public static void main(String[] args) {
Client client2 = new Client("Client2",8888);
client2.startClient();
}
}
这是服务器启动main()
```java
package Task1;
/**
*
* @author 15122
*/
public class runServer {
public static void main(String[] args) {
Server server = new Server();
server.startServer();
}
}
这些代码有部分是从网上找来的
只需更改Client和ServerThread的代码即可,参考:
package TCP;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.OutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
/**
*
* @author 15122
*/
public class Client {
public String HOST_NAME;
public int HOST_PORT;
public Client(String Name,int Port){
HOST_NAME=Name;
HOST_PORT=Port;
}
public void startClient(){
Socket socket = null;
Scanner keyboardInput = new Scanner(System.in);
try {
socket = new Socket("127.0.0.1", HOST_PORT);
System.err.println("Connection successful " );
}
catch (IOException e) {
System.err.println("Client could not make connection: " + e);
System.exit(-1);
}
BufferedReader br = null;
BufferedWriter bw=null;
InputStreamReader isr=null;
OutputStream os = null;
InputStream is = null;
try {
os = socket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(os));
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
while (true){
String toServer=keyboardInput.nextLine();
bw.write(HOST_NAME+" : "+toServer);
bw.newLine();
bw.flush();
String info = null;
info = br.readLine();
if (info != null) {
System.out.println(info);
}
if(info==null){
is.close();
os.close();
bw.close();
br.close();
System.out.println("done");
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
package TCP;
/**
*
* @author 15122
*/
import java.io.*;
import java.net.Socket;
public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
InputStream inputStream = null;
InputStreamReader inputStreamReader = null;
BufferedReader bufferedReader = null;
OutputStream outputStream = null;
PrintWriter printWriter = null;
BufferedWriter bufferedWriter = null;
String info;
try {
inputStream = socket.getInputStream();
outputStream = socket.getOutputStream();
inputStreamReader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(inputStreamReader);
bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
while (true) {
info = bufferedReader.readLine();
if(info!=null){
System.out.println(info);
bufferedWriter.write(info);
bufferedWriter.newLine();
bufferedWriter.flush();
}else{
try {
if (printWriter != null)
printWriter.close();
if (outputStream != null)
outputStream.close();
if (inputStream != null)
inputStream.close();
if (inputStreamReader != null)
inputStreamReader.close();
if (bufferedReader != null)
bufferedReader.close();
if (socket != null)
socket.close();
System.out.println("done2");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
出什么问题了呢?socket通信最好是转换为字节流进行收发。
一是客户端连接指向 127.0.0.1,你这通信只能在一台机器上玩啊?
二是服务端什麽时候启动侦听的呢?没有侦听就没有accept
具体什么问题没有描述。这种问题需要调试一下才能解决。
按这个调整下
服务器代码
public class ServerSocket {
//客户端发送信息
public static void main(String[] args) {
OutputStream out = null;
Socket socket = null;
try {
//绑定到本地端口
socket = new Socket("127.0.0.1", 8090);
//发送消息
while (true) {
System.out.println("==========");
out = socket.getOutputStream();
//输入文字,从控制台输入
Scanner san = new Scanner(System.in);
String str = san.next();
System.out.println("我:" + str);
out.write(str.getBytes());
out.flush();
//接收信息
InputStream in = socket.getInputStream();
//获取输入流里面数据并存储数据
byte[] b = new byte[1024];
StringBuffer sb = new StringBuffer();
String s;
if (in.read(b) != -1) {
s = new String(b);
System.out.println(s);
sb.append(s);
}
System.out.println("来自服务器的数据:" + sb);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端代码
public class ClientSocket {
public static void main(String[] args) {
ServerSocket server;
try {
server = new ServerSocket(8090);
Socket socket=server.accept();
while(true){
System.out.println("----------");
InputStream in;
try {
in = socket.getInputStream();
byte [] b=new byte[1024];
StringBuffer sb=new StringBuffer();
String s;
if(in.read(b) !=-1){
s=new String(b);
sb.append(s);
}
OutputStream out=socket.getOutputStream();
System.out.println("客户端信息:"+sb);
Scanner sc=new Scanner(System.in);
String str=sc.next();
System.out.println("我:"+str);
out.write(str.getBytes());
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端通过服务端进行通信
输入reg,进行注册
输入send,输入name,向其他客户端发送信息
输入all,向其他所有客户端发送信息
客户端的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<pthread.h>
#define PORT 33333
#define LINE 1024
struct message
{
int action;
char toname[20];
char msg[1024];
};
void * recv_message(void *arg)
{
int ret;
int cfd = *((int *)arg);
struct message *msg = (struct message *)malloc(sizeof(struct message));
while(1)
{
memset(msg,0,sizeof(struct message));
ret = recv(cfd,msg,sizeof(struct message),0);
if(ret < 0)
{
perror("recv error!\n");
exit(1);
}
if(ret == 0)
{
printf("%d is closed\n",cfd);
pthread_exit(NULL);
}
switch(msg->action)
{
case 1:
{
printf("reg success!\n");
break;
}
case 2:
{
printf("recv success!\n");
printf("recv message:%s\n",msg->msg);
break;
}
case 3:
{
printf("all recv success!\n");
printf("all recv message:%s\n",msg->msg);
break;
}
}
usleep(3);
}
pthread_exit(NULL);
}
int main()
{
int sockfd;
char buffer[1024];
pthread_t id;
char cmd[20];
char name[20];
char toname[20];
char message[1024];
struct sockaddr_in s_addr;
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0)
{
perror("socket error!");
exit(1);
}
printf("client socket success!\n");
bzero(&s_addr,sizeof(struct sockaddr_in));
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(PORT);
s_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(sockfd,(struct sockaddr *)(&s_addr),sizeof(struct sockaddr_in)) < 0)
{
perror("connect error!\n");
exit(1);
}
printf("connect success!\n");
if(pthread_create(&id,NULL,recv_message,(void *)(&sockfd))!=0)
{
perror("error\n");
exit(1);
}
struct message *msg = (struct message *)malloc(sizeof(struct message));
printf("cmd : reg send all!\n...");
while(1)
{
printf("Please input cmd:\n");
scanf("%s",cmd);
if(strcmp(cmd,"reg") == 0)
{
printf("Please input reg name:\n");
scanf("%s",name);
msg->action = 1;
strcpy(msg->msg,name);
if(send(sockfd,msg,sizeof(struct message),0) < 0)
{
printf("send name error\n");
exit(1);
}
}
if(strcmp(cmd,"send") == 0)
{
printf("Please input send to name:\n");
scanf("%s",toname);
printf("Please send message :\n");
scanf("%s",message);
msg->action = 2;
strcpy(msg->toname,toname);
strcpy(msg->msg ,message);
if(send(sockfd,msg,sizeof(struct message),0) < 0)
{
printf("send message error\n");
exit(1);
}
}
if(strcmp(cmd,"all") == 0)
{
printf("Please input all message:\n");
scanf("%s",message);
msg->action = 3;
strcpy(msg->msg ,message);
send(sockfd,msg,sizeof(struct message),0);
}
}
shutdown(sockfd,SHUT_RDWR);
return 0;
}
服务器的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<pthread.h>
#define PORT 33333
struct message
{
int action;
char toname[20];
char msg[1024];
};
struct online
{
int cfd;
char name[20];
struct online *next;
};
struct online *head = NULL;
void insert_user(struct online *new)
{
if(head == NULL)
{
new->next = NULL;
head = new;
}
else
{
new->next = head->next;
head->next = new;
}
}
int find_cfd(char *toname)
{
if(head == NULL)
{
return -1;
}
struct online *temp = head;
while(temp != NULL)
{
if(strcmp(temp->name ,toname) == 0)
{
return temp->cfd ;
}
temp= temp->next ;
}
return -1;
}
void * recv_message(void arg)
{
int ret;
int to_cfd;
int cfd =((int *)arg);
struct message *msg = (struct message *)malloc(sizeof(struct message));
struct online *new;
while(1)
{
memset(msg,0,sizeof(struct message));
ret = recv(cfd,msg,sizeof(struct message),0);
if(ret < 0)
{
printf("recv error!\n");
exit(1);
}
if(ret == 0)
{
printf("%d is closed\n",cfd);
pthread_exit(NULL);
}
switch(msg->action)
{
case 1:
{
printf("client reg success!\n");
new = (struct online *)malloc(sizeof(struct online));
new->cfd = cfd;
strcpy(new->name ,msg->msg);
insert_user(new);
msg->action = 1;
send(cfd,msg,sizeof(struct message),0);
break;
}
case 2:
{
to_cfd = find_cfd(msg->toname );
msg->action = 2;
send(to_cfd,msg,sizeof(struct message),0);
break;
}
case 3:
{
struct online *temp = head;
while(temp != NULL)
{
to_cfd = temp->cfd ;
msg->action = 3;
send(to_cfd,msg,sizeof(struct message),0);
temp = temp->next ;
}
break;
}
}
usleep(3);
}
pthread_exit(NULL);
}
int main()
{
int cfd;
int sockfd;
int len;
char buf[1024];
struct sockaddr_in addr;
struct sockaddr_in c_addr;
pthread_t id;
sockfd=(socket(AF_INET,SOCK_STREAM,0));
if(sockfd==-1)
{
perror("socket error\n");
exit(1);
}
printf("socket success\n");
int opt=1;
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
bzero(&addr,sizeof(struct sockaddr_in));
addr.sin_family=AF_INET;
addr.sin_port=htons(PORT);//瀛楄妭搴忚浆鍖?杞垚鏈湴鐨勭鍙e彿
//addr.sin_addr.s_addr=inet_addr(ip_addr);
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(bind(sockfd,(struct sockaddr*)(&addr),sizeof(struct sockaddr_in))<0)
{
perror("bind error\n");
exit(1);
}
printf("bind success\n");
if(listen(sockfd,3)<0)
{
perror("listen error\n");
exit(1);
}
printf("listen success\n");
while(1)
{
memset(buf,0,sizeof(buf));
bzero(&c_addr,sizeof(struct sockaddr_in));
len=sizeof(struct sockaddr_in);
printf("accepting.........\n");
if((cfd=accept(sockfd,(struct sockaddr*)(&c_addr),&len))==-1)
{
perror("accept error\n");
exit(1);
}
printf("port=%d ip=%s\n",ntohs(c_addr.sin_port),inet_ntoa(c_addr.sin_addr));
if(pthread_create(&id,NULL,recv_message,(void *)(&cfd)) != 0)
{
printf("pthread create error\n");
exit(1);
}
sleep(2);
}
return 0;
}
OK