思路:
1,利用Tcp实现聊天,必须有客户端和服务端。因为要写在同段代码上,所以使用多线程。
2,注意,使用多线程必须先将服务端运行起来,再运行客户端。否则出现异常。
3,客户端:建立端点,并初始化。读取流读取键盘录入,通过Socket方法getOutputStream将数据写入流中。
4,数据写入流中后,创建读取流,等待服务端收到数据后,所发送的数据,并打印在屏幕。
5,服务端:建立端点,并初始化。字节读取流等待数据,当流中有数据时,读取,并打印在屏幕。
5,当读取完成之后,将信息发送到客户端。通过getOutputStream。
import java.net.*;
import java.io.*;
class TcpOnline
{
public static void main(String[] args)
{
try
{
ServerSocket rec=new ServerSocket(10003);//创建服务端端点。
Rece rece=new Rece(rec);//建立服务端。
new Thread(rece).start();//服务端跑起!
Thread.sleep(2000);//等待服务端稳定。
System.out.println("Server Open new !");
Socket cli=new Socket("127.0.0.1",10003);//创建客户端端点。
Client client=new Client(cli);//建立客户端。
new Thread(client).start();//客户端跑起!
}
catch (Exception ex)
{
throw new RuntimeException("NONO");
}
}
}
class Client implements Runnable//Client
{
private Socket s;
Client(Socket s)
{
this.s=s;
}
public void run()
{
try
{
//读取流读取键盘录入。
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
//获取Tcp写入流
OutputStream out=s.getOutputStream();
//读取键盘录入,将数据写到流中。
while ((line=bufr.readLine())!=null)//read方法为阻塞式方法。
{
byte[] info=line.getBytes();
out.write(info,0,info.length);//写入流中。
out.flush();//刷新缓冲。
}
s.shutdownOutput();//数据发送完毕向服务端声明。
bufr.close();
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=0;
while ((len=in.read(buf))!=-1)
{
String str=new String(buf,0,len);
System.out.println(str);
}
}
catch (Exception ex)
{
throw new RuntimeException("Client Send lose");
}
}
}
class Rece implements Runnable//Rece
{
private ServerSocket ss;
Rece(ServerSocket ss)
{
this.ss=ss;
}
public void run()
{
try
{
Socket s=ss.accept();//获取客户端对象,并操作.
String ip=s.getInetAddress().getHostAddress();//通过客户端对象获取对方ip
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=0;
//读取流中数据.
while ((len=in.read(buf))!=-1)//read为阻塞式方法。
{
String str=new String(buf,0,len);
System.out.println(ip+"::"+str);//打印客户端数据.
}
OutputStream out=s.getOutputStream();
out.write("send ok !".getBytes());//结束信息,发送给客户端。
out.flush();
Thread.sleep(500);//保证最后一条数据有时间发送到客户端。
}
catch (Exception ex)
{
throw new RuntimeException("Rece lose");
}
}
} |