Socket实现简易聊天室,Client,Server
package seday08;
import java.io.bufferedwriter;
import java.io.outputstream;
import java.io.outputstreamwriter;
import java.io.printwriter;
import java.net.socket;
import java.util.scanner;
/**
* @author xingsir
*简易聊天室客户端
*/
public class client {
/*
* 套接字 java.net.socket
* socket封装了底层tcp协议的通讯细节,使用它可以通过
* tcp协议与服务端建立链接,并以两条流进行io操作完成 与服务端的数据交换
*/
private socket socket;//声明了一个 socket类型的对象
//构造方法
public client() {
try {
system.out.println("正在连接服务器。。。。。。");
socket =new socket("localhost",33069);//端口范围0-65535
system.out.println("已成功连接服务端!");
} catch (exception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
/*
* 客户端开始工作的方法
*/
public void start() {
try {
outputstream out = socket.getoutputstream();//客户端的socket对象上的getoutputstream方法得到的输出流其实就是发送给服务器端的数据。
outputstreamwriter osw= new outputstreamwriter(out);//字符转字节流
bufferedwriter bw=new bufferedwriter(osw);//缓冲流
printwriter pw =new printwriter(bw,true);//行更新
scanner scanner=new scanner(system.in);//控制台输入,获取键盘输入信息
while(true) {//条件为真
string message=scanner.nextline();
pw.println(message);
}
} catch (exception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
public static void main(string[] args) {
//实例化一个客户端
client client = new client();
//调用启动方法
client.start();
}
}
//===================================================================================
package seday08;
import java.io.bufferedreader;
import java.io.ioexception;
import java.io.inputstream;
import java.io.inputstreamreader;
import java.net.serversocket;
import java.net.socket;
/**
* @author xingsir
* 服务器端
*/
public class server {
private serversocket server;//声明了一个serversocket类型的对象
//构造方法
public server() {
try{
system.out.println("服务器正在启动。。。。。。");
server = new serversocket(33069);//接受的端口号
system.out.println("服务端启动完毕!");
}catch (ioexception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
//服务端工作方法
public void start() {
try {
while(true) {
system.out.println("等待客户端连接。。。。。。");
socket socket =server.accept();//accept():接受客户端的连接请求,并返回一个套接字
system.out.println("一个客户端链接了!");
/*
* socket提供的方法:inputstream getinputstream()
* 通过socket获取的输入流读取的字节是来自 远端计算机发送过来的字节。
*/
inputstream in = socket.getinputstream();
//将字节转换为字符
inputstreamreader isr= new inputstreamreader(in,"utf-8");
bufferedreader br= new bufferedreader(isr);//块读,并且可以按行读取字符串
string message = null;//声明字符串message,初始化呢为空
/*
* 通过bufferedreader读取客户端发送过来的一行字符串这个操作中,当客户端断开连接时,
* 由于 客户端系统不同,服务端这里的表现也不相同:
* windows客户端断开时,readline方法会直接抛出异常
* linux客户端断开连接时,readline方法会返回 为null
*/
while((message = br.readline())!=null) {
system.out.println("来自客户端的消息说:"+message);//控制台打印消息
}
}
} catch (exception e) {
e.printstacktrace();//输出错误堆栈信息,有助于定位并解决错误
}
}
public static void main(string[] args) {
//实例化一个server端
server server = new server();
server.start();//调用方法
}
}