1.服务端----Server.java

   

import javax.swing.*;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
/**
* Created by JXJ on 2017/6/26.
*/
public class Server extends JFrame{ private JTextField userText;
private JTextArea chatWindow;
private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;
//构造方法
public Server(){
super("即时聊天小程序");
userText=new JTextField();
userText.setEditable(false);
userText.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage(e.getActionCommand());
userText.setText("");
}
});
add(userText,BorderLayout.NORTH);
chatWindow=new JTextArea();
add(new JScrollPane(chatWindow));
setSize(300,150);
setVisible(true); } //建立并启动服务
public void startRununing(){
try{
server=new ServerSocket(6789,100);
while(true){
try{
//等待连接
waitForConnect();
//获取输入输出数据流
setupStreams();
//聊天
whileChatting();
}catch (EOFException eofException){
showMessage("\n 连接已经结束!");
}finally {
closeCrap();
}
}
}catch (IOException ioException){
ioException.printStackTrace();
}
} //等待连接,然后显示连接信息
private void waitForConnect() throws IOException{
showMessage(" 等待客户端连接...\n");
connection=server.accept();
showMessage("客户端"+connection.getInetAddress().getHostName()+"已连接!\n ");
} //获取输入输出流
private void setupStreams() throws IOException{
output=new ObjectOutputStream(connection.getOutputStream());
//这个重点关注一下
output.flush();
input=new ObjectInputStream(connection.getInputStream());
showMessage("\n数据流已建立!\n ");
}
//聊天信息处理
private void whileChatting() throws IOException {
String message="现在你已经连接上了!";
sendMessage(message);
ableToType(true);
do{
try{
message=(String)input.readObject();
showMessage(message+"\n ");
}catch (ClassNotFoundException classNotFoundException){
showMessage("用户发送信息转换异常!\n");
}
}while(!message.equals("client-end")); }
//聊天结束后关闭输入输出流和socket
private void closeCrap() {
showMessage("正在关闭连接...\n");
ableToType(false);
try{
//注意关闭先后顺序 输出流 输入流 socket
output.close();
input.close();
connection.close();
}catch (IOException ioException){ }
} //给客户端发送信息
private void sendMessage(String message) {
try{
output.writeObject("Server"+message);
output.flush();
showMessage("Server"+message+"\n");
}catch (IOException ioException){
chatWindow.append("[错误] 我没有成功发送信息!");
}
}
//在窗口上实时显示聊天信息
private void showMessage(final String text) {
//注意窗口更新信息的方式
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
chatWindow.append(text);
}
});
}
//让用户输入信息
private void ableToType(final boolean tof) {
//注意按钮的禁用与启用的方式
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
userText.setEditable(tof);
}
});
}
}

2.服务端测试----ServerTest.java

/**
* Created by JXJ on 2017/6/26.
*/
import javax.swing.JFrame;
public class ServerTest {
public static void main(String[] args){
Server server=new Server();
server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
server.startRununing();
}
}

  

   

3.客户端----Client.java

/**
* Created by JXJ on 2017/6/26.
*/
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Client extends JFrame {
private JTextField userText;
private JTextArea chatwindow;
private ObjectInputStream input;
private ObjectOutputStream output;
private String message="";
private String serverIP;
private Socket connection; //构造方法
public Client(String host){
super("客户端");
serverIP=host;
userText=new JTextField();
userText.setEditable(false);
userText.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
sendMessage(e.getActionCommand());
userText.setText("");
}
});
add(userText,BorderLayout.NORTH);
chatwindow=new JTextArea();
add(new JScrollPane(chatwindow),BorderLayout.CENTER);
setSize(300,150);
setVisible(true); }
//建立连接
public void startRununing(){
try{
connectToServer();
setupStreams();
whileChatting();
}catch (EOFException eofException){
showMessage("客户端断开连接! \n");
}catch (IOException ioExceptiopn){
ioExceptiopn.printStackTrace();
}
finally {
closeCrap();
}
} //连接到服务端
private void connectToServer() throws IOException {
showMessage("正在尝试连接服务端... \n");
connection=new Socket(InetAddress.getByName(serverIP),6789);
showMessage("已连接至"+connection.getInetAddress().getHostName());
} //建立输入输出流
private void setupStreams() throws IOException {
output=new ObjectOutputStream(connection.getOutputStream());
output.flush();
input=new ObjectInputStream(connection.getInputStream());
showMessage("已创建输入输出流... \n");
}
//聊天信息处理
private void whileChatting() throws IOException {
ableToType(true);
do{
try{
message=(String)input.readObject();
showMessage(message+"\n");
}catch (ClassNotFoundException classNotFoundException){
showMessage(" 未知的输入对象类型\n");
}
}while(!message.equals("server-end"));
}
//关闭输入输出流和socket
private void closeCrap() {
showMessage("关闭客户端连接资源\n");
ableToType(false);
try{
output.close();
input.close();
connection.close();
}catch (IOException ioException){
ioException.printStackTrace();
}
}
//给服务端发送信息
private void sendMessage(String message) {
try{
output.writeObject("client-"+message);
output.flush();
showMessage("client-"+message+"\n");
}catch (IOException ioException){
showMessage("客户端发送数据失败\n");
}
}
//在窗口上实时显示聊天信息
private void showMessage(final String text) {
//注意窗口更新信息的方式
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
chatwindow.append(text);
}
});
}
//让用户输入信息
private void ableToType(final boolean tof) {
//注意按钮的禁用与启用的方式
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
userText.setEditable(tof);
}
});
}
}

  

4.客户端测试----ClientTest.java

import javax.swing.*;

/**
* Created by JXJ on 2017/6/26.
*/
public class ClientTest {
public static void main(String[] args){
Client client=new Client("127.0.0.1");
client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.startRununing();
}
}

  

Java Socket基础[备忘]的更多相关文章

  1. Socket网络通讯开发总结之:Java 与 C进行Socket通讯 + [备忘] Java和C之间的通讯

    Socket网络通讯开发总结之:Java 与 C进行Socket通讯 http://blog.sina.com.cn/s/blog_55934df80100i55l.html (2010-04-08 ...

  2. 0. Java虚拟机系列备忘预览图

    打算把Java虚拟机这块单独弄一个主题出来,做做备忘,结构如图所示: 后面还有一部分待更新...

  3. UITextView -- 基础备忘

    UITextView 这篇文章只涉及到基本的使用,日后会写一些关于结合TextKit的备忘 基本属性 let screenSize = UIScreen.mainScreen().bounds.siz ...

  4. 【Socket】Java Socket基础编程

    Socket是Java网络编程的基础,了解还是有好处的, 这篇文章主要讲解Socket的基础编程.Socket用在哪呢,主要用在进程间,网络间通信.本篇比较长,特别做了个目录: 一.Socket通信基 ...

  5. Java Socket 基础例子

    1.服务器端代码 package com.lanber.socket; import java.io.DataInputStream; import java.io.DataOutputStream; ...

  6. JAVA Socket基础(简单实现)

    学习Socket需要了解的几个概念: Socket 指的是互联网连接中的各个终结点.互联网连接是怎么创建的,通过IP地址加端口号,进行互通. A电脑(192.168.3.125:80)>> ...

  7. scala基础备忘

    声明一个变量 声明一个常量 显式指定类型 定义一个main函数 package org.admln.scala class HelloScala { } object HelloScala { def ...

  8. java socket 基础操作

    服务端: public class Server { public static void main(String[] args) throws Exception { //1.创建一个服务器端Soc ...

  9. Java输入输出流备忘

    重要博客: http://blog.csdn.net/hguisu/article/details/7418161 File dir = new File("\\root");   ...

随机推荐

  1. 【心情】NOIP2014记忆

    无意中又翻到这张表格. 现在看起来真的感慨万分. 如果当时把link多想想,也许就能拿满分了. 如果当时的bird看出来那个傻逼背包模型就好了. 如果equation当时我想到大质数取模就好了; 如果 ...

  2. 如何用JS获取“ul”下边的“li”的个数

    <script type="text/javascript"> function OnbtnClick() { var txtCount=document.getEle ...

  3. CUDA线程协作之共享存储器“__shared__”&&“__syncthreads()”

    在GPU并行编程中,一般情况下,各个处理器都需要了解其他处理器的执行状态,在各个并行副本之间进行通信和协作,这涉及到不同线程间的通信机制和并行执行线程的同步机制. 共享内存"__share_ ...

  4. HistCite 引文分析软件的利器

    所需工具及网站清单, HISTCITE:DOWNLOAD YOUR FREE COPY. 提交自己的基本信息即可,十分简单: SCI数据库官网(web of science):http://apps. ...

  5. Gradle Android它自己的编译脚本教程的最新举措(提供demo源代码)

    一.前言 Gradle 是以 Groovy 语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自己主动化构建工具. 上面这句话我认为写得非常官方,大家仅仅需知道Gradle能够用来an ...

  6. WPF 3D动态加载模型文件

    原文:WPF 3D动态加载模型文件 这篇文章需要读者对WPF 3D有一个基本了解,至少看过官方的MSDN例子. 一般来说关于WPF使用3D的例子,都是下面的流程: 1.美工用3DMAX做好模型,生成一 ...

  7. beego中各类数据库连接方式

    beego 框架是优秀得go REST API开发框架.下面针对beego中各类数据库连接操作做一个总结. 1. orm连接方式 beego中的orm操作支持三种数据库:mysql,sqlite3,p ...

  8. 【Java】【Flume】Flume-NG阅读源代码AvroSink

    org.apache.flume.sink.AvroSink是用来通过网络来数据传输的.能够将event发送到RPCserver(比方AvroSource),使用AvroSink和AvroSource ...

  9. sdut 5-1 继承和派生

    5-1 继承与派生 Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 通过本题目的练习能够掌握继承与派生的概念.派生类的定义和用法.当中派生类构造函数的定义 ...

  10. &lt;PC&gt;HP网络共享并创建一个热点问题

    郁闷了一年多 你不能使用本地连接的开放热点 网上说的网卡驱动程序,系统设置等.,我们解决不了 原本BIOS节能设置错误 导致在连续主动对自己的有线无线功能被禁用 该LAN\WLAN  Switchin ...