import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TCPTalk extends JFrame implements ActionListener{
public static void main(String[] args){
new TCPTalk();
}
JLabel jl_state,jl_purpose,jl_receive,jl_name;
JTextField jt_state,jt_purpose,jt_name,jt_sendmeg;
JButton jb_connection,jb_uncon,jb_sendmeg;
JTextArea textArea;
JRadioButton ServerRadio,ClientRadio;
JPanel jp1,jp2,jp3,jp4;
JScrollPane megJScrollPane;
String meg;
TCP_server t1;
TCP_client t2;
ServerSocket serversocket;
Socket Ssocket,Csocket;
BufferedReader in1;
PrintWriter out1;
public TCPTalk(){
super("TCP聊天");
Container cont=getContentPane();
cont.setLayout(null);
ButtonGroup bg = new ButtonGroup();
ServerRadio = new JRadioButton("服务器",true);
ServerRadio.setSize(80,20);
ServerRadio.setFont(new Font("宋体",Font.BOLD,14));
ServerRadio.setLocation(10,20);
bg.add(ServerRadio);
cont.add(ServerRadio);
ClientRadio = new JRadioButton("客户端",false);
ClientRadio.setSize(80,20);
ClientRadio.setFont(new Font("宋体",Font.BOLD,14));
ClientRadio.setLocation(100,20);
cont.add(ClientRadio);
bg.add(ClientRadio);
jl_state=new JLabel("连接状态");
jl_state.setSize(100,20);
jl_state.setFont(new Font("宋体",Font.BOLD,14));
jl_state.setLocation(190,20);
cont.add(jl_state);
jt_state = new JTextField("离线");
jt_state.setBackground(Color.gray);
jt_state.setSize(100,20);
jt_state.setFont(new Font("宋体",Font.PLAIN,14));
jt_state.setLocation(320,20);
cont.add(jt_state);
jl_purpose=new JLabel("连接主机IP");
jl_purpose.setSize(100,20);
jl_purpose.setFont(new Font("宋体",Font.BOLD,14));
jl_purpose.setLocation(10,50);
cont.add(jl_purpose);
jt_purpose=new JTextField("127.0.0.1");
jt_purpose.setForeground(Color.orange);
jt_purpose.setSize(250,20);
jt_purpose.setLocation(120,50);
cont.add(jt_purpose);
jb_connection=new JButton("连接");
jb_connection.setSize(100,20);
jb_connection.setFont(new Font("宋体",Font.BOLD,14));
jb_connection.setLocation(380,50);
cont.add(jb_connection);
jb_connection.addActionListener(this);
jl_receive=new JLabel("接受到的信息");
jl_receive.setSize(100,20);
jl_receive.setFont(new Font("宋体",Font.BOLD,14));
jl_receive.setLocation(10,80);
cont.add(jl_receive);
textArea = new JTextArea();
textArea.setForeground(Color.red);
textArea.setLineWrap(true);
textArea.setSize(250,200);
textArea.setFont(new Font("宋体",Font.BOLD,12));
megJScrollPane = new JScrollPane(textArea);
megJScrollPane.setSize(250,200);
megJScrollPane.setLocation(120,80);
cont.add(megJScrollPane);
jb_uncon=new JButton("结束连接");
jb_uncon.setSize(100,20);
jb_uncon.setFont(new Font("宋体",Font.BOLD,14));
jb_uncon.setLocation(380,80);
cont.add(jb_uncon);
jb_uncon.addActionListener(this);
jl_name=new JLabel("你的昵称");
jl_name.setSize(100,20);
jl_name.setFont(new Font("宋体",Font.BOLD,14));
jl_name.setLocation(10,260);
cont.add(jl_name);
jt_name=new JTextField();
jt_name.setSize(100,20);
jt_name.setFont(new Font("宋体",Font.BOLD,14));
jt_name.setLocation(10,300);
cont.add(jt_name);
jt_sendmeg=new JTextField();
jt_sendmeg.setSize(250,20);
jt_sendmeg.setFont(new Font("楷体",Font.BOLD,14));
jt_sendmeg.setLocation(120,300);
cont.add(jt_sendmeg);
jb_sendmeg=new JButton("发送信息");
jb_sendmeg.setSize(100,20);
jb_sendmeg.setFont(new Font("楷体",Font.BOLD,14));
jb_sendmeg.setLocation(380,300);
cont.add(jb_sendmeg);
jb_sendmeg.addActionListener(this);
t1=new TCP_server();
t2=new TCP_client();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(500, 400);
setVisible(true);
setResizable(false);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==jb_connection)//判断是否按下连接按钮
{
if(ServerRadio.isSelected()==true)//判断是否选为服务器端
{
meg= "";
jt_sendmeg.setText("");
t1.start();
}else{
meg= "";
jt_sendmeg.setText("");
t2.start();
}
}
if(e.getSource()==jb_sendmeg)
{
out1.write(jt_name.getText()+"说:"+jt_sendmeg.getText()+"\n");
textArea.append("我说:"+jt_sendmeg.getText()+"\n");
out1.flush();
jt_sendmeg.setText("");
}
if(e.getSource()==jb_uncon)
{
try{
if(ServerRadio.isSelected()==true){
Ssocket.close();
serversocket.close();
jt_state.setText("离线");
jt_state.setBackground(Color.gray);
jb_sendmeg.setEnabled(false);
jb_uncon.setEnabled(false);
jb_connection.setEnabled(true);
}else{
Csocket.close();
jt_state.setText("离线");
jt_state.setBackground(Color.gray);
jb_sendmeg.setEnabled(false);
jb_uncon.setEnabled(false);
jb_connection.setEnabled(true);
}
}catch(IOException e2)
{
jt_state.setText("发生错误!");
}
}
}
class TCP_server extends Thread{
public TCP_server(){
}
public void run()
{
try{
jb_connection.setEnabled(false);
jb_uncon.setEnabled(true);
jt_state.setText("等待连接...");
jt_purpose.setText(InetAddress.getLocalHost().getHostAddress());
serversocket=new ServerSocket(8000);
Ssocket=serversocket.accept();
in1=new BufferedReader(new InputStreamReader(Ssocket.getInputStream()));
out1=new PrintWriter(Ssocket.getOutputStream(),true);
while(true){
if(Ssocket.isBound()==true){
jt_state.setText("通话中...");
jt_state.setBackground(Color.green);
jb_uncon.setEnabled(true);
jb_sendmeg.setEnabled(true);
break;
}
}
while(true)
{
meg=in1.readLine();
if(meg.length()>0)
{
textArea.append(meg);
textArea.append("\n");
}
}
}catch(IOException e){}
}
}
class TCP_client extends Thread{
public TCP_client(){
}
public void run()
{
try{
jb_connection.setEnabled(false);
jt_state.setText("等待连接...");
Csocket=new Socket();
Csocket.connect(new InetSocketAddress(jt_purpose.getText(),8000),5000);
in1= new BufferedReader(new InputStreamReader(Csocket.getInputStream()));
out1=new PrintWriter(Csocket.getOutputStream(),true);
while(true){
if(Csocket.isConnected()==true){
jt_state.setText("通话中...");
jt_state.setBackground(Color.green);
jb_uncon.setEnabled(true);
jb_sendmeg.setEnabled(true);
break;
}
}
meg= "";
while(Csocket.isConnected()==true){
meg=in1.readLine();
if(meg.length()>0){
textArea.append(meg);
textArea.append("\n");
}
}
}catch(IOException e){
jt_state.setText("无法连接到指定服务器!");
}
}
}
}