java程序---聊天程序

Python010

java程序---聊天程序,第1张

客户端:package com.toolimport java.io.BufferedReader

import java.io.IOException

import java.io.InputStreamReader

import java.io.PrintWriter

import java.net.InetAddress

import java.net.Socket

import java.net.UnknownHostException/**

* 网络编程 聊天程序 文件传送程序

*

* @author zb

*

*/

public class SocketTalkingClient { public static void main(String[] args) {

SocketTalkingClient st = new SocketTalkingClient()

try

{

st.createClient()

}catch(Exception e)

{

e.printStackTrace()

}

} int port = 1129

public void createClient() throws UnknownHostException, IOException {

Socket server = new Socket(InetAddress.getLocalHost(), port)

BufferedReader in = new BufferedReader(new InputStreamReader(server

.getInputStream()))

PrintWriter out = new PrintWriter(server.getOutputStream()) BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)) while (true) {

String line = wt.readLine()

out.println(line)

out.flush() String receiveWord = in.readLine() System.out.println("Client: receive -->" + receiveWord)

if (receiveWord.equals("exit")) {

break

}

} server.close()}}

服务端:package com.toolimport java.io.BufferedReader

import java.io.IOException

import java.io.InputStreamReader

import java.io.PrintWriter

import java.net.ServerSocket

import java.net.Socket/**

* 网络编程 聊天程序 文件传送程序

*

* @author zb

*

*/

public class SocketTalking { public static void main(String[] args) {

SocketTalking st = new SocketTalking()

try

{

st.createServer()

}catch(Exception e)

{

e.printStackTrace()

}

} int port = 1129public void createServer() throws IOException {

// 建立一个固定位置的服务方

// 这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.

// 另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip

// 作为保留端口,因此你所分配的端口只能是1024个之后的

ServerSocket server = new ServerSocket(port) //每一个客户端启动一个线程处理

while (true) {

MultiClient client = new MultiClient(server.accept())

client.start()

} } /**

* 服务端的多线程运行 接收多个客户端

*

* @author Administrator

*

*/

class MultiClient extends Thread { private Socket socket public MultiClient(Socket s) {

socket = s

} public void run() { try {

// 读取socket

BufferedReader in = new BufferedReader(new InputStreamReader(

socket.getInputStream())) // 写入socket

PrintWriter out = new PrintWriter(socket.getOutputStream()) while(true)

{

String str = in.readLine()System.out.println("Server: receive -->" + str)//服务端向客户端发送报文

out.println(str)out.flush()if (str.equals("exit")) {

break

}

}

socket.close()

} catch (Exception e) {

e.printStackTrace()

} finally {

System.out.println("this Thread is over")

//如果保存服务端不关闭 一直运行 可以注释掉改方法 以适用多个线程 多个客户端的情况

System.exit(0)

} }

}}

服务器端:

import java.awt.*

import java.awt.event.*

import javax.swing.*

import java.io.*

import java.net.*

public class Server extends JFrame implements ActionListener{

JPanel contentPane

JLabel jLabel2 = new JLabel()

JTextField jTextField2 = new JTextField("4700")

JButton jButton1 = new JButton()

JLabel jLabel3 = new JLabel()

JTextField jTextField3 = new JTextField()

JButton jButton2 = new JButton()

JScrollPane jScrollPane1 = new JScrollPane()

JTextArea jTextArea1 = new JTextArea()

ServerSocket server = null

Socket socket = nullBufferedReader instr =nullPrintWriter os=null

//Construct the frame

public Server() {

jbInit()

}

class MyThread extends Thread{//该线程负责接受数据

public void run(){

try{

while(true){

this.sleep(100)

instr= new BufferedReader(new InputStreamReader(socket.getInputStream()))

if(instr.ready()){ //检查是否有数据

jTextArea1.append("客户端: "+instr.readLine()+"\n")

}

}

}catch(Exception ex){}

}

}

public void actionPerformed(ActionEvent e){

if(e.getSource()==jButton1){

int port=Integer.parseInt(jTextField2.getText().trim())

listenClient(port)

}

if(e.getSource()==jButton2){

String s=this.jTextField3.getText().trim()

sendData(s)

}

}

private void listenClient(int port){//侦听

try{

if(jButton1.getText().trim().equals("侦听")){

server = new ServerSocket(port)

jButton1.setText("正在侦听...")

socket=server.accept()//等待,一直到客户端连接才望下执行

sendData("已经成功连接。。。")

jButton1.setText("正在聊天...")

jTextArea1.append("客户端已经连接到服务器\n")

MyThread t=new MyThread()

t.start()

}

}catch(Exception ex){

}

}

private void sendData(String s){//发送数据

try{

os= new PrintWriter(socket.getOutputStream())

os.println(s)

os.flush()

if(!s.equals("已经成功连接。。。"))

this.jTextArea1.append("Server:"+s+"\n")

}catch(Exception ex){

}

}

//Component initialization

private void jbInit() {

contentPane = (JPanel) this.getContentPane()

contentPane.setLayout(null)

this.setSize(new Dimension(540, 340))

this.setTitle("服务器")

jLabel2.setBounds(new Rectangle(22, 27, 72, 28))

jLabel2.setText("端口号")

jLabel2.setFont(new java.awt.Font("宋体", 0, 14))

jTextField2.setBounds(new Rectangle(113, 27, 315, 24))

jButton1.setBounds(new Rectangle(440, 28, 73, 25))

jButton1.setFont(new java.awt.Font("Dialog", 0, 14))

jButton1.setBorder(BorderFactory.createEtchedBorder())

jButton1.setActionCommand("jButton1")

jButton1.setText("侦听")

jLabel3.setBounds(new Rectangle(23, 57, 87, 28))

jLabel3.setText("请输入信息")

jLabel3.setFont(new java.awt.Font("宋体", 0, 14))

jTextField3.setBounds(new Rectangle(114, 60, 314, 24))

jTextField3.setText("")

jButton2.setText("发送")

jButton2.setActionCommand("jButton1")

jButton2.setBorder(BorderFactory.createEtchedBorder())

jButton2.setFont(new java.awt.Font("Dialog", 0, 14))

jButton2.setBounds(new Rectangle(440, 58, 73, 25))

jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189))

contentPane.add(jTextField2, null)

contentPane.add(jButton1, null)

contentPane.add(jLabel3, null)

contentPane.add(jTextField3, null)

contentPane.add(jButton2, null)

contentPane.add(jScrollPane1, null)

contentPane.add(jLabel2, null)

jScrollPane1.getViewport().add(jTextArea1, null)

jButton1.addActionListener(this)

jButton2.addActionListener(this)

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

try{

socket.close()

instr.close()

System.exit(0)

}catch(Exception ex){

}

}

})

}

public static void main(String arg[]){

JFrame.setDefaultLookAndFeelDecorated(true)

Server frm=new Server()

frm.setVisible(true)

}

}

客户端:

import java.awt.*

import java.awt.event.*

import javax.swing.*

import java.io.*

import java.net.*

public class Client extends JFrame implements ActionListener{

JPanel contentPane

JLabel jLabel1 = new JLabel()

JTextField jTextField1 = new JTextField("127.0.0.1")

JLabel jLabel2 = new JLabel()

JTextField jTextField2 = new JTextField("4700")

JButton jButton1 = new JButton()

JLabel jLabel3 = new JLabel()

JTextField jTextField3 = new JTextField()

JButton jButton2 = new JButton()

JScrollPane jScrollPane1 = new JScrollPane()

JTextArea jTextArea1 = new JTextArea()

BufferedReader instr =null

Socket socket = null

PrintWriter os=null

public Client() {

jbInit()

}

class MyThread extends Thread{

public void run(){

try{

os=new PrintWriter(socket.getOutputStream())

instr=new BufferedReader(new InputStreamReader(socket.getInputStream()))

while(true){

this.sleep(100)

if(instr.ready()){

jTextArea1.append("服务器: "

+instr.readLine()+"\n")

}

}

}catch(Exception ex){

}

}

}

public void actionPerformed(ActionEvent e){

if(e.getSource()==jButton1){

String ip=jTextField3.getText().trim()

int port=Integer.parseInt(jTextField2.getText().trim())

connectServer(ip,port)

}

if(e.getSource()==jButton2){

String s=this.jTextField3.getText().trim()

sendData(s)

}

}

private void connectServer(String ip,int port){//连接

try{

if(jButton1.getText().trim().equals("连接")){

jButton1.setText("连接服务器...")

socket=new Socket(ip,port)

jButton1.setText("正在聊天")

MyThread t=new MyThread()

t.start()

}

}catch(Exception ex){

}

}

private void sendData(String s){//发送数据

try{

os = new PrintWriter(socket.getOutputStream())

os.println(s)

os.flush()

this.jTextArea1.append("Server:"+s+"\n")

}catch(Exception ex){

}

}

private void jbInit() {

contentPane = (JPanel) this.getContentPane()

jLabel1.setFont(new java.awt.Font("宋体", 0, 14))

jLabel1.setText("服务器名称")

jLabel1.setBounds(new Rectangle(20, 22, 87, 28))

contentPane.setLayout(null)

this.setSize(new Dimension(540, 340))

this.setTitle("客户端")

jTextField1.setBounds(new Rectangle(114, 26, 108, 24))

jLabel2.setBounds(new Rectangle(250, 25, 72, 28))

jLabel2.setText("端口号")

jLabel2.setFont(new java.awt.Font("宋体", 0, 14))

jTextField2.setBounds(new Rectangle(320, 27, 108, 24))

jButton1.setBounds(new Rectangle(440, 28, 73, 25))

jButton1.setFont(new java.awt.Font("Dialog", 0, 14))

jButton1.setBorder(BorderFactory.createEtchedBorder())

jButton1.setActionCommand("jButton1")

jButton1.setText("连接")

jLabel3.setBounds(new Rectangle(23, 57, 87, 28))

jLabel3.setText("请输入信息")

jLabel3.setFont(new java.awt.Font("宋体", 0, 14))

jTextField3.setBounds(new Rectangle(114, 60, 314, 24))

jButton2.setText("发送")

jButton2.setActionCommand("jButton1")

jButton2.setBorder(BorderFactory.createEtchedBorder())

jButton2.setFont(new java.awt.Font("Dialog", 0, 14))

jButton2.setBounds(new Rectangle(440, 58, 73, 25))

jScrollPane1.setBounds(new Rectangle(23, 92, 493, 189))

contentPane.add(jLabel1, null)

contentPane.add(jTextField1, null)

contentPane.add(jLabel2, null)

contentPane.add(jTextField2, null)

contentPane.add(jButton1, null)

contentPane.add(jLabel3, null)

contentPane.add(jTextField3, null)

contentPane.add(jButton2, null)

contentPane.add(jScrollPane1, null)

jScrollPane1.getViewport().add(jTextArea1, null)

jButton1.addActionListener(this)

jButton2.addActionListener(this)

this.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent e){

try{

socket.close()instr.close()os.close()System.exit(0)

}catch(Exception ex){

}

}

})

}

public static void main(String arg[]){

JFrame.setDefaultLookAndFeelDecorated(true)

Client frm=new Client()

frm.setVisible(true)

}

}

先启动服务器端,侦听端口,再启动客户端,就行了