
import java.net.*
import java.io.*
public class ClientSocketDemo
{
//声明客户端Socket对象socket
Socket socket = null
//声明客户器端数据输入输出流
DataInputStream in
DataOutputStream out
//声明字符串数组对象response,用于存储从服务器接收到的信息
String response[]
//执行过程中,没有参数漏弊时的构造方法,本地服务器在本地,取默认端口10745
public ClientSocketDemo()
{
try
{
//创建客户端socket,服务器地址取本地,端口号为10745
socket = new Socket("localhost",10745)
//创建客户端数据输入输出早搜厅流,用于对服务器端发送或接收数据
in = new DataInputStream(socket.getInputStream())
out = new DataOutputStream(socket.getOutputStream())
//获取客户端地址及端口号
String ip = String.valueOf(socket.getLocalAddress())
String port = String.valueOf(socket.getLocalPort())
//向服务器发送数据
out.writeUTF("Hello Server.This connection is from client.")
out.writeUTF(ip)
out.writeUTF(port)
//从服务器接收数据
response = new String[3]
for (int i = 0i <response.lengthi++)
{
response[i] = in.readUTF()
System.out.println(response[i])
}
}
catch(UnknownHostException e){e.printStackTrace()}
catch(IOException e){e.printStackTrace()}
}
//执行过程中,有一个参数时的构造方法,参数指定服务器地址,取默认端口10745
public ClientSocketDemo(String hostname)
{
try
{
//创建客户端socket,hostname参数指定服务器地陆隐址,端口号为10745
socket = new Socket(hostname,10745)
in = new DataInputStream(socket.getInputStream())
out = new DataOutputStream(socket.getOutputStream())
String ip = String.valueOf(socket.getLocalAddress())
String port = String.valueOf(socket.getLocalPort())
out.writeUTF("Hello Server.This connection is from client.")
out.writeUTF(ip)
out.writeUTF(port)
response = new String[3]
for (int i = 0i <response.lengthi++)
{
response[i] = in.readUTF()
System.out.println(response[i])
}
}
catch(UnknownHostException e){e.printStackTrace()}
catch(IOException e){e.printStackTrace()}
}
//执行过程中,有两个个参数时的构造方法,第一个参数hostname指定服务器地址
//第一个参数serverPort指定服务器端口号
public ClientSocketDemo(String hostname,String serverPort)
{
try
{
socket = new Socket(hostname,Integer.parseInt(serverPort))
in = new DataInputStream(socket.getInputStream())
out = new DataOutputStream(socket.getOutputStream())
String ip = String.valueOf(socket.getLocalAddress())
String port = String.valueOf(socket.getLocalPort())
out.writeUTF("Hello Server.This connection is from client.")
out.writeUTF(ip)
out.writeUTF(port)
response = new String[3]
for (int i = 0i <response.lengthi++)
{
response[i] = in.readUTF()
System.out.println(response[i])
}
}
catch(UnknownHostException e){e.printStackTrace()}
catch(IOException e){e.printStackTrace()}
}
public static void main(String[] args)
{
String comd[] = args
if(comd.length == 0)
{
System.out.println("Use localhost(127.0.0.1) and default port")
ClientSocketDemo demo = new ClientSocketDemo()
}
else if(comd.length == 1)
{
System.out.println("Use default port")
ClientSocketDemo demo = new ClientSocketDemo(args[0])
}
else if(comd.length == 2)
{
System.out.println("Hostname and port are named by user")
ClientSocketDemo demo = new ClientSocketDemo(args[0],args[1])
}
else System.out.println("ERROR")
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
【ServerSocketDemo.java 服务器端Java源代码】
import java.net.*
import java.io.*
public class ServerSocketDemo
{
//声明ServerSocket类对象
ServerSocket serverSocket
//声明并初始化服务器端监听端口号常量
public static final int PORT = 10745
//声明服务器端数据输入输出流
DataInputStream in
DataOutputStream out
//声明InetAddress类对象ip,用于获取服务器地址及端口号等信息
InetAddress ip = null
//声明字符串数组对象request,用于存储从客户端发送来的信息
String request[]
public ServerSocketDemo()
{
request = new String[3]//初始化字符串数组
try
{
//获取本地服务器地址信息
ip = InetAddress.getLocalHost()
//以PORT为服务端口号,创建serverSocket对象以监听该端口上的连接
serverSocket = new ServerSocket(PORT)
//创建Socket类的对象socket,用于保存连接到服务器的客户端socket对象
Socket socket = serverSocket.accept()
System.out.println("This is server:"+String.valueOf(ip)+PORT)
//创建服务器端数据输入输出流,用于对客户端接收或发送数据
in = new DataInputStream(socket.getInputStream())
out = new DataOutputStream(socket.getOutputStream())
//接收客户端发送来的数据信息,并显示
request[0] = in.readUTF()
request[1] = in.readUTF()
request[2] = in.readUTF()
System.out.println("Received messages form client is:")
System.out.println(request[0])
System.out.println(request[1])
System.out.println(request[2])
//向客户端发送数据
out.writeUTF("Hello client!")
out.writeUTF("Your ip is:"+request[1])
out.writeUTF("Your port is:"+request[2])
}
catch(IOException e){e.printStackTrace()}
}
public static void main(String[] args)
{
ServerSocketDemo demo = new ServerSocketDemo()
}
}
话说网上真的好多啊...package client
import java.awt.Color
import java.awt.Container
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import java.io.DataInputStream
import java.io.DataOutputStream
import java.io.IOException
import java.net.Socket
import java.util.Date
import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JOptionPane
import javax.swing.JScrollPane
import javax.swing.JTextArea
import javax.swing.JTextField
public class ClientFrame extends JFrame{
private JTextArea allmsg
private JTextField welcome,copyright,chatmsg
private JButton send
private JScrollPane js
private boolean isConnected = true
public DataOutputStream out
public DataInputStream in
public Socket s = null
String nic /* -- 保存用户昵称 --*/
/**
* 初始化客户端资源
* 1.获取从LoginFrame传递过来的参数
* 2.初始化界面元素
* 3.初始化通信所需要的资源 EG:输入/输出流(DataInputStream/DataOutputStream)
* */察稿猛
public ClientFrame(String name,Socket socket)
{
this.setSize(310,660)
this.setLocation(290,50)
this.setTitle("聊天室客户端<"+name+">"败桥)/* -- 指定窗口的标题 --*/
this.s = socket/* -- 接收从LoginFrame中传递过来的Socket --*/
this.nic = name+" 说: "
welcome = new JTextField(" <"+name+" >欢迎您来到聊天室 ",100)
welcome.setBackground(Color.blue)
welcome.setEnabled(false)
copyright = new JTextField(" ----- all copyright @ TOP-king -----")
copyright.setEnabled(false)
allmsg = new JTextArea()
allmsg.setEditable(false)
allmsg.append(" 系统消息: 欢迎登录在线聊天室敬链 \n")
js = new JScrollPane(allmsg)//为JTextArea添加滚动条
chatmsg = new JTextField("在此输入聊天信息")
chatmsg.addActionListener(new listen())
send = new JButton("发送")
send.addActionListener(new listen())/* -- 添加事件监听器 --*/
try {
out = new DataOutputStream(s.getOutputStream())
in = new DataInputStream(s.getInputStream())
} catch (IOException e) {JOptionPane.showMessageDialog(null, "系统异常","错误",JOptionPane.OK_CANCEL_OPTION)}
addcomponettocontainer()
/* -- 当用户关闭窗口时进行相关的处理 eg:Socket Data(Input/Output)Stream 的关闭--*/
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we)
{
sendmsg("quit&logout")/* -- 向服务器端发送关闭信息 --*/
isConnected = false
destory()/* -- 销毁窗口资源 --*/
}
})
new Thread(new linread()).start()/* -- 启动读取信息线程 --*/
}
public void addcomponettocontainer()
{
Container c = this.getContentPane()
c.setLayout(null)
welcome.setBounds(75,10,150,20)
js.setBounds(10,50,280,500)
chatmsg.setBounds(10,560,180,30)
send.setBounds(220,560,70,30)
copyright.setBounds(10,600,280,20)
c.add(welcome)
c.add(js)
c.add(chatmsg)
c.add(send)
c.add(copyright)
this.setVisible(true)
this.setResizable(false)
}
class listen implements ActionListener
{
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==send||e.getSource()==chatmsg)
{
String msg = chatmsg.getText().trim()
if("".equals(msg))
{
JOptionPane.showMessageDialog(null,"发送信息不能为空!","错误",JOptionPane.OK_OPTION)
}
else
{sendmsg((new Date()).toLocaleString()+"\n"+nic+msg+"\n")chatmsg.setText("")}
}
}
}
/* -- 向服务器端发送信息 --*/
public void sendmsg(String m)
{
if(isConnected)//如果socket的输出流没关闭
{
try {
out.writeUTF(m)
} catch (IOException e) {
JOptionPane.showMessageDialog(null,"发送信息失败!(系统异常)","错误",JOptionPane.OK_OPTION)
}
}
else
{
JOptionPane.showMessageDialog(null,"发送信息失败!(服务器关闭/网络故障)","错误",JOptionPane.OK_OPTION)
}
}
/* -- 读取信息线程 --*/
class linread implements Runnable
{
public void run()
{
read()
}
public void read()
{
while(isConnected)
{
try {
String msg = in.readUTF()
if("SYSTEM_CLOSED".equals(msg))
{
JOptionPane.showMessageDialog(null,"读取消息失败(服务器关闭/网络故障)!","错误",JOptionPane.OK_OPTION)
isConnected = false
}
else
allmsg.append(msg+"\n")
} catch (IOException e) {
}
}//end while
JOptionPane.showMessageDialog(null,"读取消息失败(服务器关闭/网络故障)!","错误",JOptionPane.OK_OPTION)
}//end read()
}
public void destory()
{
try {
this.out.close()
this.in.close()
this.s.close()
} catch (IOException e) {
}
this.dispose()
}
}
======================================================
package client
import java.awt.*
import javax.swing.*
import java.awt.event.*
import java.io.*
import java.net.*
public class LoginFrame extends JFrame{
private JTextField name
private JTextField ip
private JButton ok,cancle
public Socket socket
public LoginFrame()
{
super("登录框")
this.setSize(400,80)
this.setLocation(100,100)
name = new JTextField("昵称")
ip = new JTextField("127.0.0.1")
ok = new JButton("登录")
cancle = new JButton("取消")
ok.addActionListener(new listenEvent())
cancle.addActionListener(new listenEvent())
//建立容器
addcomponettocontainer()
this.setDefaultCloseOperation(EXIT_ON_CLOSE)
}
/**
* 建立容器及控件
*/
public void addcomponettocontainer()
{
Container c = this.getContentPane()
c.setLayout(null)
name.setBounds(10,10,100,30)
ip.setBounds(120,10,100,30)
ok.setBounds(230,10,70,30)
cancle.setBounds(310,10,70,30)
c.add(name)
c.add(ip)
c.add(ok)
c.add(cancle)
this.setVisible(true)
this.setResizable(false)
}
public class listenEvent implements ActionListener
{
public void actionPerformed(ActionEvent event) {
// TODO Auto-generated method stub
if(event.getSource()==ok)
{
String n = name.getText().trim()
String i = ip.getText().trim()
if("".equals(n)||"".equals(i))
{
JOptionPane.showMessageDialog(null,"昵称、IP不能够为空!","错误",JOptionPane.OK_OPTION)
}
else{login(n,i)}
}
if(event.getSource()==cancle)
{
name.setText("")
ip.setText("")
}
}
}
/**
* 进行登录
* @param name
* @param ip
*/
public void login(String name,String ip)
{
try {
socket = new Socket(ip,7777)
DataOutputStream out = new DataOutputStream(socket.getOutputStream())
out.writeUTF(name)
out.flush()//强制输出缓存中的内容
//out.close()
new ClientFrame(name,socket)
destroywindow()
} catch (UnknownHostException e) {
JOptionPane.showMessageDialog(null,"找不到主机地址(IP错误/网络故障)!","错误",JOptionPane.OK_OPTION)
} catch (IOException e) {
}
}
public void destroywindow()
{
this.dispose()
}
public static void main(String[] args)
{
new LoginFrame()
}
}
==================================================
package server
import java.awt.Container
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import java.io.DataInputStream
import java.io.DataOutputStream
import java.io.IOException
import java.net.ServerSocket
import java.net.Socket
import java.util.ArrayList
import java.util.Date
import javax.swing.JButton
import javax.swing.JFrame
import javax.swing.JOptionPane
import javax.swing.JScrollPane
import javax.swing.JTextArea
import javax.swing.JTextField
public class ServerFrame extends JFrame{
/**
*
*/
private static final long serialVersionUID = 1L
private JTextArea allmsg
private JTextField currnum,totalnum,copyright,chatmsg
private JButton send
private JScrollPane js
int num1,num2,port/* -- num1:当前在线人数 num2:总上线人数 port:服务端口号 --*/
private ServerSocket ss
ArrayList<user>lists//存放所有在线用户
public ServerFrame()
{
super("聊天室服务器端")
this.setSize(310,660)
this.setLocation(200,50)
lists = new ArrayList<user>()
num1 = num2 =0
port = 7777
currnum = new JTextField(" 当前在线人数: "+num1)
currnum.setEnabled(false)
totalnum = new JTextField(" 上线总人数: "+num2)
totalnum.setEnabled(false)
copyright = new JTextField(" ----- all copyright @ TOP-king -----")
copyright.setEnabled(false)
allmsg = new JTextArea()
allmsg.append(" --------------- 系统消息 --------------\n")
allmsg.setEditable(false)
allmsg.setLineWrap(true)//允许自动换行
js = new JScrollPane(allmsg)//为JTextArea添加滚动条
chatmsg = new JTextField("在此输入系统信息")
chatmsg.addActionListener(new ActionListener(){
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent arg0) {
String str = chatmsg.getText().trim()
if(!"".equals(str))
{sendmsg((new Date()).toLocaleString()+" -- 系统消息: "+str)chatmsg.setText("")}
else
JOptionPane.showMessageDialog(null, "消息不能为空","错误",JOptionPane.OK_OPTION)
chatmsg.setText("")/* -- 发送信息后,将输入栏中的信息清空 -- */
}
})
send = new JButton("发送")
send.addActionListener(new ActionListener(){
@SuppressWarnings("deprecation")
public void actionPerformed(ActionEvent arg0) {
String str = chatmsg.getText().trim()
if(!"".equals(str))
{sendmsg((new Date()).toLocaleString()+" -- 系统消息: "+str)chatmsg.setText("")}
else
JOptionPane.showMessageDialog(null, "消息不能为空","错误",JOptionPane.OK_OPTION)
chatmsg.setText("")/* -- 发送信息后,将输入栏中的信息清空 -- */
}
})
//建立容器
addcomponettocontainer()
this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we)
{
sendmsg("SYSTEM_CLOSED")/* -- 向客户端发送服务器关闭信息 -- */
destory()
}
})
start()/* -- 启动连接服务 -- */
}
public void addcomponettocontainer()
{
//Container建立容器
Container c = this.getContentPane()
c.setLayout(null)
currnum.setBounds(20,15,130,20)
totalnum.setBounds(155,15,125,20)
js.setBounds(10,50,280,500)
chatmsg.setBounds(10,560,180,30)
send.setBounds(220,560,70,30)
copyright.setBounds(10,600,280,20)
c.add(currnum)
c.add(totalnum)
c.add(js)
c.add(chatmsg)
c.add(send)
c.add(copyright)
this.setVisible(true)
this.setResizable(false)
}
/**
* start()方法监听客户的连接
* 并且保存客户端的相关信息EG:用户昵称、用户所使用的Socket
* 用户连接到服务器成功之后,将其保存到用户列表中,并为该用户启动一个线程用于通信 */
@SuppressWarnings("deprecation")
public void start()
{
boolean isStarted = false/* -- 用于标记服务器是否已经正常启动 -- */
try {
this.ss = new ServerSocket(port)
isStarted = true
this.allmsg.append((new Date()).toLocaleString()+"服务器启动 @ 端口: "+port+"\n")
while(isStarted)
{
Socket client = this.ss.accept()/* -- 监听客户端的连接 -- */
DataInputStream in = new DataInputStream(client.getInputStream())
String name = in.readUTF()
user u = new user()
u.name = name
u.socket = client
lists.add(u)//将该用户加到列表中去
num1++
num2++
currnum.setText(" 当前在线人数: "+num1)
totalnum.setText(" 上线总人数: "+num2)
this.allmsg.append((new Date()).toLocaleString()+" : "+u.name+" 登录 \n")
new Thread(new ClientThread(u)).start()/* -- 为该用户启动一个通信线程 -- */
}
} catch (IOException e) {
System.out.println("服务器已经启动......")
System.exit(0)
}
}
/**
* 通信线程主要功能包括:
* 1.监听客户端输入的信息
* 2.将接收到的信息转发给其他用户 */
class ClientThread implements Runnable
{
user user = null
boolean isConnected = true
DataInputStream dis = null
DataOutputStream dos = null
public ClientThread(user u)
{
this.user = u
try {
this.dis = new DataInputStream(this.user.socket.getInputStream())
this.dos = new DataOutputStream(this.user.socket.getOutputStream())
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace()
}
}
public void run()
{
readmsg()
}
/* -- 读取客户的聊天信息 -- */
@SuppressWarnings("deprecation")
public void readmsg()
{
while(isConnected)
{
try {
String msg = dis.readUTF()
if("quit&logout".equals(msg))//当用户关闭客户端窗口时,发送quit字符串 表示用户已经退出
{
num1--
try{
this.dis.close()
this.dos.close()
this.user.socket.close()
this.isConnected = false
}catch(IOException ioe)
{
ioe.printStackTrace()
}finally{
this.isConnected = false
if(dis!=null) this.dis.close()
if(dos!=null) this.dos.close()
if(this.user.socket!=null) this.user.socket.close()
}
lists.remove(this.user)//从列表中删除该用户
currnum.setText(" 当前在线人数: "+num1)
allmsg.append((new Date()).toLocaleString()+" : "+this.user.name+" 退出\n")
}
else
sendmsg(msg)
} catch (IOException e) {
e.printStackTrace()
}
}
}
}
/* -- 将信息进行转发 -- */
public void sendmsg(String msg)
{
user us = new user()
DataOutputStream os = null
if(lists.size()>0)
{
for(int i=0i<lists.size()i++)
{
us = lists.get(i)
try {
os = new DataOutputStream(us.socket.getOutputStream())
os.writeUTF(msg)
} catch (IOException e) {
e.printStackTrace()
}
}
}
else
JOptionPane.showMessageDialog(null, "当前无用户在线。发送消息失败","失败",JOptionPane.OK_OPTION)
}
public void destory()
{
try {
this.ss.close()
} catch (IOException e) {
e.printStackTrace()
}
this.dispose()
}
public static void main(String[] args)
{
new ServerFrame()
}
}
=================================================
package server
import java.net.*
public class user {
String name
Socket socket
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)